From c0c375aa3f430d686dd6527e832aae6fcb9d5545 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Thu, 21 May 2015 14:50:18 +0300 Subject: [PATCH 001/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/css/source/lib/_navigation.less | 5 ++ lib/web/mage/menu.js | 61 +++++++++++++++---------- 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/lib/web/css/source/lib/_navigation.less b/lib/web/css/source/lib/_navigation.less index 6bc9cb68b24..c634943e534 100644 --- a/lib/web/css/source/lib/_navigation.less +++ b/lib/web/css/source/lib/_navigation.less @@ -370,6 +370,11 @@ top: 0 !important; left: 100% !important; } + .submenu-revers{ + bottom: 0 !important; + left: auto !important; + right: 100%; + } } &.more { position: relative; diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 94055ff0a1d..f5f30a088d4 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -91,7 +91,7 @@ define([ _keydown: function(event) { var match, prev, character, skip, regex, - preventDefault = true; + preventDefault = true; function escape( value ) { return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); @@ -260,7 +260,7 @@ define([ event.preventDefault(); var target = $( event.target ).closest( ".ui-menu-item" ); - + if ( !target.hasClass('level-top') || !target.has( ".ui-menu" ).length ) { window.location.href = target.find('> a').attr('href'); } @@ -325,11 +325,22 @@ define([ } }, "mouseenter .ui-menu-item": function( event ) { - var target = $( event.currentTarget ); + var target = $(event.currentTarget), + leftThreshold = (event.pageX + (target.find('ul').get(0).getBoundingClientRect().width * 2)), + rightThreshold = (target.find('ul').get(0).getBoundingClientRect().width) * 2, + clientWindowWidth = $(window).width(); // Remove ui-state-active class from siblings of the newly focused menu item // to avoid a jump caused by adjacent elements both having a class with a border - target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" ); - this.focus( event, target ); + target.siblings().children(".ui-state-active").removeClass("ui-state-active"); + //reverse sub-menus direction from left to right bounds + if (leftThreshold > clientWindowWidth) { + target.find('ul').addClass('submenu-reverse'); + } + //redirect reverse + if (event.pageX <= rightThreshold) { + target.find('ul').removeClass('submenu-reverse'); + } + this.focus(event, target); }, "mouseleave": function( event ){ this.collapseAll( event, true ); @@ -386,8 +397,8 @@ define([ if(responsive == "onResize") { $(window).on('resize', function() { if($(window).width() > that.options.breakpoint) { - that._responsive(); - $('[responsive=more]').show(); + that._responsive(); + $('[responsive=more]').show(); } else { that.element.children().show(); $('[responsive=more]').hide(); @@ -444,8 +455,8 @@ define([ $.each(items, function(index, item){ var itemText = items[index].item - .find('a:first') - .text(); + .find('a:first') + .text(); width += parseInt(items[index].itemSize, null); @@ -453,20 +464,20 @@ define([ items[index].item.show(); more.each(function() { - var text = $(this).text(); - if(text === itemText){ - $(this).parent().hide(); - } - }); + var text = $(this).text(); + if(text === itemText){ + $(this).parent().hide(); + } + }); } else if(width > containerSize) { items[index].item.hide(); more.each(function() { - var text = $(this).text(); - if(text === itemText){ - $(this).parent().show(); - } - }); + var text = $(this).text(); + if(text === itemText){ + $(this).parent().show(); + } + }); } }); }, @@ -486,15 +497,15 @@ define([ $(this).hide(); $('.ui-menu-more > li > ul > li a').each(function() { - var text = $(this).text(); - if(text === itemText){ - $(this).parent().show(); - } - }); + var text = $(this).text(); + if(text === itemText){ + $(this).parent().show(); + } + }); }); } }); - + return { menu: $.mage.menu, navigation: $.mage.navigation -- GitLab From ff8fff079bae4073d1bc1e13c824bf54c9c77130 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Thu, 21 May 2015 16:27:46 +0300 Subject: [PATCH 002/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/mage/menu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index f5f30a088d4..4265ed8401d 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -326,8 +326,8 @@ define([ }, "mouseenter .ui-menu-item": function( event ) { var target = $(event.currentTarget), - leftThreshold = (event.pageX + (target.find('ul').get(0).getBoundingClientRect().width * 2)), rightThreshold = (target.find('ul').get(0).getBoundingClientRect().width) * 2, + leftThreshold = (event.pageX + rightThreshold), clientWindowWidth = $(window).width(); // Remove ui-state-active class from siblings of the newly focused menu item // to avoid a jump caused by adjacent elements both having a class with a border -- GitLab From 09961f3f31f5980d91c4d1f7fb061fd68a9cd97e Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 22 May 2015 12:31:35 +0300 Subject: [PATCH 003/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/mage/menu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 4265ed8401d..314e4557e92 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -326,7 +326,8 @@ define([ }, "mouseenter .ui-menu-item": function( event ) { var target = $(event.currentTarget), - rightThreshold = (target.find('ul').get(0).getBoundingClientRect().width) * 2, + ulWidth = target.find('ul').get(0) ? target.find('ul').get(0).getBoundingClientRect().width: null, + rightThreshold = ulWidth * 2, leftThreshold = (event.pageX + rightThreshold), clientWindowWidth = $(window).width(); // Remove ui-state-active class from siblings of the newly focused menu item -- GitLab From a606d605f27bc6d8dc5fc766b7adf40672296dde Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 22 May 2015 16:22:48 +0300 Subject: [PATCH 004/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/mage/menu.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 314e4557e92..a193d05e325 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -20,6 +20,13 @@ define([ expanded: false, delay: 300 }, + _create: function(){ + this._super(); + var self = this; + $(window).on('resize', function(){ + self.element.find('.submenu-reverse').removeClass('submenu-reverse'); + }); + }, _init: function() { this._super(); -- GitLab From 2b71fa338f588c7975d2313ec8cf11e68eb56476 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 22 May 2015 17:28:20 +0300 Subject: [PATCH 005/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/mage/menu.js | 261 ++++++++++++++++++++++--------------------- 1 file changed, 131 insertions(+), 130 deletions(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index a193d05e325..b0c2ca620d5 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -8,7 +8,7 @@ define([ "jquery/ui", "jquery/jquery.mobile.custom", "mage/translate" -], function($, mediaCheck){ +], function ($, mediaCheck) { 'use strict'; /** @@ -20,29 +20,29 @@ define([ expanded: false, delay: 300 }, - _create: function(){ + _create: function () { this._super(); var self = this; - $(window).on('resize', function(){ + $(window).on('resize', function () { self.element.find('.submenu-reverse').removeClass('submenu-reverse'); }); }, - _init: function() { + _init: function () { this._super(); this.delay = this.options.delay; - if(this.options.expanded === true) { + if (this.options.expanded === true) { this.isExpanded(); } - if(this.options.responsive === true){ + if (this.options.responsive === true) { mediaCheck({ media: '(max-width: 640px)', - entry: $.proxy(function() { + entry: $.proxy(function () { this._toggleMobileMode(); }, this), - exit: $.proxy(function() { + exit: $.proxy(function () { this._toggleDesktopMode(); }, this) }); @@ -51,7 +51,7 @@ define([ this._assignControls()._listen(); }, - _assignControls: function() { + _assignControls: function () { this.controls = { toggleBtn: $('[data-action="toggle-nav"]'), swipeArea: $('.nav-sections') @@ -60,125 +60,125 @@ define([ return this; }, - _listen: function() { + _listen: function () { var controls = this.controls; var toggle = this.toggle; - this._on(controls.toggleBtn, { 'click' : toggle }); - this._on(controls.swipeArea, { 'swipeleft': toggle }); + this._on(controls.toggleBtn, {'click': toggle}); + this._on(controls.swipeArea, {'swipeleft': toggle}); }, - toggle: function() { + toggle: function () { if ($('html').hasClass('nav-open')) { $('html').removeClass('nav-open'); - setTimeout(function() { + setTimeout(function () { $('html').removeClass('nav-before-open'); - },300); + }, 300); } else { $('html').addClass('nav-before-open'); - setTimeout(function() { + setTimeout(function () { $('html').addClass('nav-open'); - },42); + }, 42); } }, //Add class for expanded option - isExpanded: function() { - var subMenus = this.element.find( this.options.menus ), + isExpanded: function () { + var subMenus = this.element.find(this.options.menus), expandedMenus = subMenus.find('ul'); expandedMenus.addClass('expanded'); }, - _activate: function( event ) { + _activate: function (event) { window.location.href = this.active.find('> a').attr('href'); this.collapseAll(event); }, - _keydown: function(event) { + _keydown: function (event) { var match, prev, character, skip, regex, preventDefault = true; - function escape( value ) { - return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); + function escape(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&"); } - if(this.active.closest('ul').attr('aria-expanded') != 'true') { + if (this.active.closest('ul').attr('aria-expanded') != 'true') { - switch ( event.keyCode ) { + switch (event.keyCode) { case $.ui.keyCode.PAGE_UP: - this.previousPage( event ); + this.previousPage(event); break; case $.ui.keyCode.PAGE_DOWN: - this.nextPage( event ); + this.nextPage(event); break; case $.ui.keyCode.HOME: - this._move( "first", "first", event ); + this._move("first", "first", event); break; case $.ui.keyCode.END: - this._move( "last", "last", event ); + this._move("last", "last", event); break; case $.ui.keyCode.UP: - this.previous( event ); + this.previous(event); break; case $.ui.keyCode.DOWN: - if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { - this.expand( event ); + if (this.active && !this.active.is(".ui-state-disabled")) { + this.expand(event); } break; case $.ui.keyCode.LEFT: - this.previous( event ); + this.previous(event); break; case $.ui.keyCode.RIGHT: - this.next( event ); + this.next(event); break; case $.ui.keyCode.ENTER: case $.ui.keyCode.SPACE: - this._activate( event ); + this._activate(event); break; case $.ui.keyCode.ESCAPE: - this.collapse( event ); + this.collapse(event); break; default: preventDefault = false; prev = this.previousFilter || ""; - character = String.fromCharCode( event.keyCode ); + character = String.fromCharCode(event.keyCode); skip = false; - clearTimeout( this.filterTimer ); + clearTimeout(this.filterTimer); - if ( character === prev ) { + if (character === prev) { skip = true; } else { character = prev + character; } - regex = new RegExp( "^" + escape( character ), "i" ); - match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { - return regex.test( $( this ).children( "a" ).text() ); + regex = new RegExp("^" + escape(character), "i"); + match = this.activeMenu.children(".ui-menu-item").filter(function () { + return regex.test($(this).children("a").text()); }); - match = skip && match.index( this.active.next() ) !== -1 ? - this.active.nextAll( ".ui-menu-item" ) : + match = skip && match.index(this.active.next()) !== -1 ? + this.active.nextAll(".ui-menu-item") : match; // If no matches on the current filter, reset to the last character pressed // to move down the menu to the first item that starts with that character - if ( !match.length ) { - character = String.fromCharCode( event.keyCode ); - regex = new RegExp( "^" + escape( character ), "i" ); - match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { - return regex.test( $( this ).children( "a" ).text() ); + if (!match.length) { + character = String.fromCharCode(event.keyCode); + regex = new RegExp("^" + escape(character), "i"); + match = this.activeMenu.children(".ui-menu-item").filter(function () { + return regex.test($(this).children("a").text()); }); } - if ( match.length ) { - this.focus( event, match ); - if ( match.length > 1 ) { + if (match.length) { + this.focus(event, match); + if (match.length > 1) { this.previousFilter = character; - this.filterTimer = this._delay(function() { + this.filterTimer = this._delay(function () { delete this.previousFilter; - }, 1000 ); + }, 1000); } else { delete this.previousFilter; } @@ -187,65 +187,65 @@ define([ } } } else { - switch ( event.keyCode ) { + switch (event.keyCode) { case $.ui.keyCode.DOWN: - this.next( event ); + this.next(event); break; case $.ui.keyCode.UP: - this.previous( event ); + this.previous(event); break; case $.ui.keyCode.RIGHT: - if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { - this.expand( event ); + if (this.active && !this.active.is(".ui-state-disabled")) { + this.expand(event); } break; case $.ui.keyCode.ENTER: case $.ui.keyCode.SPACE: - this._activate( event ); + this._activate(event); break; case $.ui.keyCode.LEFT: case $.ui.keyCode.ESCAPE: - this.collapse( event ); + this.collapse(event); break; default: preventDefault = false; prev = this.previousFilter || ""; - character = String.fromCharCode( event.keyCode ); + character = String.fromCharCode(event.keyCode); skip = false; - clearTimeout( this.filterTimer ); + clearTimeout(this.filterTimer); - if ( character === prev ) { + if (character === prev) { skip = true; } else { character = prev + character; } - regex = new RegExp( "^" + escape( character ), "i" ); - match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { - return regex.test( $( this ).children( "a" ).text() ); + regex = new RegExp("^" + escape(character), "i"); + match = this.activeMenu.children(".ui-menu-item").filter(function () { + return regex.test($(this).children("a").text()); }); - match = skip && match.index( this.active.next() ) !== -1 ? - this.active.nextAll( ".ui-menu-item" ) : + match = skip && match.index(this.active.next()) !== -1 ? + this.active.nextAll(".ui-menu-item") : match; // If no matches on the current filter, reset to the last character pressed // to move down the menu to the first item that starts with that character - if ( !match.length ) { - character = String.fromCharCode( event.keyCode ); - regex = new RegExp( "^" + escape( character ), "i" ); - match = this.activeMenu.children( ".ui-menu-item" ).filter(function() { - return regex.test( $( this ).children( "a" ).text() ); + if (!match.length) { + character = String.fromCharCode(event.keyCode); + regex = new RegExp("^" + escape(character), "i"); + match = this.activeMenu.children(".ui-menu-item").filter(function () { + return regex.test($(this).children("a").text()); }); } - if ( match.length ) { - this.focus( event, match ); - if ( match.length > 1 ) { + if (match.length) { + this.focus(event, match); + if (match.length > 1) { this.previousFilter = character; - this.filterTimer = this._delay(function() { + this.filterTimer = this._delay(function () { delete this.previousFilter; - }, 1000 ); + }, 1000); } else { delete this.previousFilter; } @@ -255,27 +255,27 @@ define([ } } - if ( preventDefault ) { + if (preventDefault) { event.preventDefault(); } }, - _toggleMobileMode: function() { + _toggleMobileMode: function () { $(this.element).off('mouseenter mouseleave'); this._on({ - "click .ui-menu-item:has(a)": function( event ) { + "click .ui-menu-item:has(a)": function (event) { event.preventDefault(); - var target = $( event.target ).closest( ".ui-menu-item" ); + var target = $(event.target).closest(".ui-menu-item"); - if ( !target.hasClass('level-top') || !target.has( ".ui-menu" ).length ) { + if (!target.hasClass('level-top') || !target.has(".ui-menu").length) { window.location.href = target.find('> a').attr('href'); } } }); var subMenus = this.element.find('.level-top'); - $.each(subMenus, $.proxy(function(index, item) { + $.each(subMenus, $.proxy(function (index, item) { var category = $(item).find('> a span').not('.ui-menu-icon').text(), categoryUrl = $(item).find('> a').attr('href'), menu = $(item).find('> .ui-menu'); @@ -288,52 +288,52 @@ define([ .addClass('ui-menu-item all-category') .html(this.categoryLink); - if(menu.find('.all-category').length === 0) { + if (menu.find('.all-category').length === 0) { menu.prepend(this.categoryParent); } }, this)); }, - _toggleDesktopMode: function() { + _toggleDesktopMode: function () { this._on({ // Prevent focus from sticking to links inside menu after clicking // them (focus should always stay on UL during navigation). - "mousedown .ui-menu-item > a": function( event ) { + "mousedown .ui-menu-item > a": function (event) { event.preventDefault(); }, - "click .ui-state-disabled > a": function( event ) { + "click .ui-state-disabled > a": function (event) { event.preventDefault(); }, - "click .ui-menu-item:has(a)": function( event ) { - var target = $( event.target ).closest( ".ui-menu-item" ); - if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) { - this.select( event ); + "click .ui-menu-item:has(a)": function (event) { + var target = $(event.target).closest(".ui-menu-item"); + if (!this.mouseHandled && target.not(".ui-state-disabled").length) { + this.select(event); // Only set the mouseHandled flag if the event will bubble, see #9469. - if ( !event.isPropagationStopped() ) { + if (!event.isPropagationStopped()) { this.mouseHandled = true; } // Open submenu on click - if ( target.has( ".ui-menu" ).length ) { - this.expand( event ); - } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) { + if (target.has(".ui-menu").length) { + this.expand(event); + } else if (!this.element.is(":focus") && $(this.document[0].activeElement).closest(".ui-menu").length) { // Redirect focus to the menu - this.element.trigger( "focus", [ true ] ); + this.element.trigger("focus", [true]); // If the active item is on the top level, let it stay active. // Otherwise, blur the active item since it is no longer visible. - if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) { - clearTimeout( this.timer ); + if (this.active && this.active.parents(".ui-menu").length === 1) { + clearTimeout(this.timer); } } } }, - "mouseenter .ui-menu-item": function( event ) { + "mouseenter .ui-menu-item": function (event) { var target = $(event.currentTarget), - ulWidth = target.find('ul').get(0) ? target.find('ul').get(0).getBoundingClientRect().width: null, + ulWidth = target.find('ul').get(0) ? target.find('ul').get(0).getBoundingClientRect().width : null, rightThreshold = ulWidth * 2, leftThreshold = (event.pageX + rightThreshold), clientWindowWidth = $(window).width(); @@ -350,8 +350,8 @@ define([ } this.focus(event, target); }, - "mouseleave": function( event ){ - this.collapseAll( event, true ); + "mouseleave": function (event) { + this.collapseAll(event, true); }, "mouseleave .ui-menu": "collapseAll" }); @@ -369,10 +369,11 @@ define([ } }, - _delay: function(handler, delay) { + _delay: function (handler, delay) { handler.apply(this, arguments); - return setTimeout(function() {}, delay || 0); + return setTimeout(function () { + }, delay || 0); } }); @@ -387,7 +388,7 @@ define([ breakpoint: 768 }, - _init: function() { + _init: function () { this._super(); var that = this, @@ -402,9 +403,9 @@ define([ this.setMaxItems(); //check responsive option - if(responsive == "onResize") { - $(window).on('resize', function() { - if($(window).width() > that.options.breakpoint) { + if (responsive == "onResize") { + $(window).on('resize', function () { + if ($(window).width() > that.options.breakpoint) { that._responsive(); $('[responsive=more]').show(); } else { @@ -412,14 +413,14 @@ define([ $('[responsive=more]').hide(); } }); - } else if(responsive == "onReload") { + } else if (responsive == "onReload") { this._responsive(); } }, - setupMoreMenu: function() { + setupMoreMenu: function () { var moreListItems = this.element.children().clone(), - moreLink = $('<a>'+ this.options.moreText +'</a>'); + moreLink = $('<a>' + this.options.moreText + '</a>'); moreListItems.hide(); @@ -437,15 +438,15 @@ define([ .attr('responsive', 'more') .append(this.moreListContainer) .menu({ - position : { - my : "right top", - at : "right bottom" + position: { + my: "right top", + at: "right bottom" } }) .insertAfter(this.element); }, - _responsive: function() { + _responsive: function () { var container = $(this.options.container), containerSize = container.width(), width = 0, @@ -453,7 +454,7 @@ define([ more = $('.ui-menu-more > li > ul > li a'); - items = items.map(function() { + items = items.map(function () { var item = {}; item.item = $(this); @@ -461,28 +462,28 @@ define([ return item; }); - $.each(items, function(index, item){ + $.each(items, function (index, item) { var itemText = items[index].item .find('a:first') .text(); width += parseInt(items[index].itemSize, null); - if(width < containerSize) { + if (width < containerSize) { items[index].item.show(); - more.each(function() { + more.each(function () { var text = $(this).text(); - if(text === itemText){ + if (text === itemText) { $(this).parent().hide(); } }); - } else if(width > containerSize) { + } else if (width > containerSize) { items[index].item.hide(); - more.each(function() { + more.each(function () { var text = $(this).text(); - if(text === itemText){ + if (text === itemText) { $(this).parent().show(); } }); @@ -490,7 +491,7 @@ define([ }); }, - setMaxItems: function() { + setMaxItems: function () { var items = this.element.children('li'), itemsCount = items.length, maxItems = this.options.maxItems, @@ -499,14 +500,14 @@ define([ overflowItems.hide(); - overflowItems.each(function(){ + overflowItems.each(function () { var itemText = $(this).find('a:first').text(); $(this).hide(); - $('.ui-menu-more > li > ul > li a').each(function() { + $('.ui-menu-more > li > ul > li a').each(function () { var text = $(this).text(); - if(text === itemText){ + if (text === itemText) { $(this).parent().show(); } }); @@ -515,7 +516,7 @@ define([ }); return { - menu: $.mage.menu, + menu: $.mage.menu, navigation: $.mage.navigation }; }); -- GitLab From b6d1792bb3a2c41d9e4034bd37b93122fb851ba6 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 22 May 2015 17:34:32 +0300 Subject: [PATCH 006/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/mage/menu.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index b0c2ca620d5..a9945f13493 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -21,8 +21,9 @@ define([ delay: 300 }, _create: function () { - this._super(); var self = this; + + this._super(); $(window).on('resize', function () { self.element.find('.submenu-reverse').removeClass('submenu-reverse'); }); -- GitLab From e8db70f7fd0093a85779d0c48300b8d306a02bef Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Fri, 22 May 2015 18:11:05 +0300 Subject: [PATCH 007/396] MAGETWO-36389: Customer review changes in backend are not reflected in frontend until cache is cleared --- .../Review/view/frontend/layout/review_product_listajax.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3af29a203ff..f4a3b2f0eae 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" cacheable="false"/> <block class="Magento\Theme\Block\Html\Pager" name="product_review_list.toolbar"> <arguments> <argument name="show_per_page" xsi:type="boolean">false</argument> -- GitLab From 1a36cf2d37529fbd3a6e43fd6257981419904254 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Mon, 25 May 2015 11:02:05 +0300 Subject: [PATCH 008/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/mage/menu.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index a9945f13493..e0d80937fa3 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -338,6 +338,7 @@ define([ rightThreshold = ulWidth * 2, leftThreshold = (event.pageX + rightThreshold), clientWindowWidth = $(window).width(); + // Remove ui-state-active class from siblings of the newly focused menu item // to avoid a jump caused by adjacent elements both having a class with a border target.siblings().children(".ui-state-active").removeClass("ui-state-active"); -- GitLab From 45fb2d1fd60ae6cbaf9ec0754e4ab637bf260745 Mon Sep 17 00:00:00 2001 From: Oleg Zinoviev <ozinoviev@ebay.com> Date: Mon, 25 May 2015 12:42:25 +0300 Subject: [PATCH 009/396] MAGETWO-37890: Product options are displayed not styled on "edit Product from Wishlist" Frontend page --- .../Magento_Bundle/web/css/source/_module.less | 13 ++++++++++++- .../luma/Magento_Bundle/web/css/source/_module.less | 5 +++-- 2 files changed, 15 insertions(+), 3 deletions(-) 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 623c17ced66..72714b88fe0 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 { + display: inline-block; + font-weight: @form-field-label__font-weight; + margin: 0 0 @indent__xs; + } + 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/luma/Magento_Bundle/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Bundle/web/css/source/_module.less index 688523fb46f..fff762ff803 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 @@ -168,7 +168,7 @@ //-------------------------------------- .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .bundle-actions { - .action.primary.customize { + .actminicart_contention.primary.customize { width: auto; } } @@ -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%; } -- GitLab From 0684a1716ad01a3adb0aefdd45c71d1d23546105 Mon Sep 17 00:00:00 2001 From: Oleg Zinoviev <ozinoviev@ebay.com> Date: Mon, 25 May 2015 12:51:50 +0300 Subject: [PATCH 010/396] MAGETWO-37890: Product options are displayed not styled on "edit Product from Wishlist" Frontend page --- .../Magento/luma/Magento_Bundle/web/css/source/_module.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fff762ff803..ed0d2520f68 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 @@ -168,7 +168,7 @@ //-------------------------------------- .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .bundle-actions { - .actminicart_contention.primary.customize { + .action.primary.customize { width: auto; } } -- GitLab From f97191e26adf95cc85b562add9d12ab9961dc6ad Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Mon, 25 May 2015 17:03:21 +0300 Subject: [PATCH 011/396] MAGETWO-37730: Cache is not updated when changing stock status using mass action --- .../Model/Adminhtml/Stock/Item.php | 16 +++++++++++++++- .../Test/Unit/Model/Adminhtml/Stock/ItemTest.php | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php index 56c05595a2c..3bb818201aa 100644 --- a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php +++ b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php @@ -11,13 +11,14 @@ 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; /** * 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 +123,17 @@ class Item extends \Magento\CatalogInventory\Model\Stock\Item { return true; } + + /** + * @inheritdoc + */ + public function getIdentities() + { + $tags = []; + if ($this->getProductId()) { + $tags[] = 'catalog_product_' . $this->getProductId(); + } + + return $tags; + } } 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 bcf805e7260..096c3e60ebd 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()); + } } -- GitLab From 6cdbbf5dd2907261851cc5db583051a5aa878c59 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Tue, 26 May 2015 13:08:20 +0300 Subject: [PATCH 012/396] MAGETWO-32234: Subcategories in menu are shown instantly when user moves mouse quickly - Added delay config and fix --- lib/web/mage/menu.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 94055ff0a1d..659fb0f915f 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -349,11 +349,8 @@ define([ }, 300); } }, - _delay: function(handler, delay) { - handler.apply(this, arguments); - - return setTimeout(function() {}, delay || 0); + this._super(handler, delay); } }); -- GitLab From 9c165984d769ad597943fdb06665bebc2d72549e Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Tue, 26 May 2015 14:43:28 +0300 Subject: [PATCH 013/396] MAGETWO-37247: Restricted Admin can change Open Amount Value for gift card without permissions --- app/code/Magento/Review/Model/Review.php | 17 ++++++++++++++++- .../Review/Test/Unit/Model/ReviewTest.php | 12 ++++++++++++ .../frontend/layout/review_product_listajax.xml | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Review/Model/Review.php b/app/code/Magento/Review/Model/Review.php index 3660815cf02..1771ad54371 100644 --- a/app/code/Magento/Review/Model/Review.php +++ b/app/code/Magento/Review/Model/Review.php @@ -6,6 +6,7 @@ namespace Magento\Review\Model; use Magento\Catalog\Model\Product; +use Magento\Framework\Object\IdentityInterface; use Magento\Review\Model\Resource\Review\Product\Collection as ProductCollection; use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; @@ -21,7 +22,7 @@ use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; * @method \Magento\Review\Model\Review setStatusId(int $value) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class Review extends \Magento\Framework\Model\AbstractModel +class Review extends \Magento\Framework\Model\AbstractModel implements IdentityInterface { /** * Event prefix for observer @@ -359,4 +360,18 @@ class Review extends \Magento\Framework\Model\AbstractModel { return $this->getResource()->getEntityIdByCode($entityCode); } + + /** + * Return unique ID(s) for each object in system + * + * @return array + */ + public function getIdentities() + { + $tags = []; + if ($this->isApproved() && $this->getEntityPkValue()) { + $tags[] = Product::CACHE_TAG . '_' . $this->getEntityPkValue(); + } + return $tags; + } } diff --git a/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php b/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php index e96842c2cc2..4be052abd03 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 f4a3b2f0eae..0f950489f8a 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" cacheable="false"/> + <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> -- GitLab From fd332edb59e1f61eaa87fd7a48708f141b0d12bf Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Tue, 26 May 2015 14:56:43 +0300 Subject: [PATCH 014/396] MAGETWO-37730: Cache is not updated when changing stock status using mass action --- .../Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php index 3bb818201aa..3721e0f822c 100644 --- a/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php +++ b/app/code/Magento/CatalogInventory/Model/Adminhtml/Stock/Item.php @@ -12,6 +12,7 @@ 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 @@ -131,7 +132,7 @@ class Item extends \Magento\CatalogInventory\Model\Stock\Item implements Identit { $tags = []; if ($this->getProductId()) { - $tags[] = 'catalog_product_' . $this->getProductId(); + $tags[] = Product::CACHE_TAG . '_' . $this->getProductId(); } return $tags; -- GitLab From ad91f4c0a71196639a6301766f6fa95e37c3104e Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Tue, 26 May 2015 14:43:28 +0300 Subject: [PATCH 015/396] MAGETWO-36389: Customer review changes in backend are not reflected in frontend until cache is cleared --- app/code/Magento/Review/Model/Review.php | 17 ++++++++++++++++- .../Review/Test/Unit/Model/ReviewTest.php | 12 ++++++++++++ .../frontend/layout/review_product_listajax.xml | 2 +- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Review/Model/Review.php b/app/code/Magento/Review/Model/Review.php index 3660815cf02..1771ad54371 100644 --- a/app/code/Magento/Review/Model/Review.php +++ b/app/code/Magento/Review/Model/Review.php @@ -6,6 +6,7 @@ namespace Magento\Review\Model; use Magento\Catalog\Model\Product; +use Magento\Framework\Object\IdentityInterface; use Magento\Review\Model\Resource\Review\Product\Collection as ProductCollection; use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; @@ -21,7 +22,7 @@ use Magento\Review\Model\Resource\Review\Status\Collection as StatusCollection; * @method \Magento\Review\Model\Review setStatusId(int $value) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ -class Review extends \Magento\Framework\Model\AbstractModel +class Review extends \Magento\Framework\Model\AbstractModel implements IdentityInterface { /** * Event prefix for observer @@ -359,4 +360,18 @@ class Review extends \Magento\Framework\Model\AbstractModel { return $this->getResource()->getEntityIdByCode($entityCode); } + + /** + * Return unique ID(s) for each object in system + * + * @return array + */ + public function getIdentities() + { + $tags = []; + if ($this->isApproved() && $this->getEntityPkValue()) { + $tags[] = Product::CACHE_TAG . '_' . $this->getEntityPkValue(); + } + return $tags; + } } diff --git a/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php b/app/code/Magento/Review/Test/Unit/Model/ReviewTest.php index e96842c2cc2..4be052abd03 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 f4a3b2f0eae..0f950489f8a 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" cacheable="false"/> + <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> -- GitLab From 237b0c2a38edcb6b77026de291d9d1c1cb996ea4 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Tue, 26 May 2015 15:57:05 +0300 Subject: [PATCH 016/396] MAGETWO-36023: [UI] Shopping Cart: Gift Wrapping and Gift Messages --- .../view/frontend/templates/cart/form.phtml | 44 ++ .../templates/cart/item/default.phtml | 147 ++++- .../view/frontend/templates/applied.phtml | 18 + .../view/frontend/templates/form.phtml | 78 +++ .../web/css/source/module/_cart.less | 43 +- .../web/css/source/_module.less | 323 ++++++---- .../web/css/source/module/_cart.less | 164 +++-- .../web/css/source/_module.less | 352 ++++++----- .../web/css/source/_module.less | 28 +- .../Magento/luma/web/css/source/_extends.less | 7 +- .../luma/web/css/source/_variables.less | 2 + .../Magento/luma/web/fonts/Luma-Icons.eot | Bin 6132 -> 6944 bytes .../Magento/luma/web/fonts/Luma-Icons.svg | 55 +- .../Magento/luma/web/fonts/Luma-Icons.ttf | Bin 5956 -> 6768 bytes .../Magento/luma/web/fonts/Luma-Icons.woff | Bin 5516 -> 6844 bytes .../Magento/luma/web/fonts/Luma-Icons.woff2 | Bin 2948 -> 3272 bytes .../Magento/luma/web/fonts/selection.json | 478 ++++++++++---- lib/web/css/docs/docs.css | 6 +- lib/web/css/docs/icons.html | 581 +++++++++--------- lib/web/css/docs/source/icons.less | 6 + lib/web/css/source/lib/variables/_icons.less | 2 + .../Blank-Theme-Icons/Blank-Theme-Icons.eot | Bin 6728 -> 6380 bytes .../Blank-Theme-Icons/Blank-Theme-Icons.svg | 53 +- .../Blank-Theme-Icons/Blank-Theme-Icons.ttf | Bin 6524 -> 6176 bytes .../Blank-Theme-Icons/Blank-Theme-Icons.woff | Bin 4976 -> 6252 bytes .../Blank-Theme-Icons/Blank-Theme-Icons.woff2 | Bin 3236 -> 3060 bytes .../fonts/Blank-Theme-Icons/selection.json | 431 +++++++++---- 27 files changed, 1920 insertions(+), 898 deletions(-) create mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml create mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/form.phtml 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 d34488d2b67..dcbf1bf3667 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,48 @@ <input type="hidden" value="" id="update_cart_action_container" /> </div> </form> + +<?php /* Temp MAGETWO-36023 markup */?> +<div class="cart-gift-item"> + <div class="gift-item-block block" + data-collapsible="true" + data-mage-init='{"collapsible":{"openedState": "_active"}}'> + <div class="title" data-role="title"> + <span><?php echo __('Gift wrap this order'); ?></span> + </div> + <div class="content" data-role="content"> + <div class="gift-options"> + <?php /* Gift Wrapping */ ?> + <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\new-options.phtml')); ?> + + <?php /* Gift Message */ ?> + <?php include ($block->getTemplateFile('Magento_GiftMessage::form.phtml')); ?> + </div> + + <?php /* Gift options applied */ ?> + <div class="gift-summary"> + <?php /* Applied Gift Wrapping */ ?> + <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\applied.phtml')); ?> + + <?php /* Applied Gift Message */ ?> + <?php include ($block->getTemplateFile('Magento_GiftMessage::applied.phtml')); ?> + + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action action-edit" title="Edit"> + <span><?php echo __('Edit'); ?></span> + </button> + <button class="action action-delete" title="Delete"> + <span><?php echo __('Delete'); ?></span> + </button> + </div> + </div> + </div> + <?php /* End Gift options applied */ ?> + </div> + </div> +</div> + +<?php /* End Temp MAGETWO-36023 markup */?> + <?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 7d0ceffcb8b..947a4681864 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 @@ -119,18 +119,32 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <td colspan="<?php echo $cols;?>"> <div class="actions-toolbar"> + <?php /* Temp MAGETWO-36023 markup */?> + <a href="#" + class="action action-gift"> + <span><?php echo __('Gift wrap'); ?></span> + </a> + <?php /* End Temp MAGETWO-36023 markup */?> + <?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"> + class="use-ajax action action-towishlist"> <span><?php echo __('Move to Wishlist'); ?></span> </a> <?php endif ?> <?php endif ?> + <?php /* Temp MAGETWO-36023 markup */?> + <a href="#" + class="action action-giftregistry"> + <span><?php echo __('Move to Registry'); ?></span> + </a> + <?php /* End Temp MAGETWO-36023 markup */?> + <?php if ($isVisibleProduct): ?> - <a class="action edit" + <a class="action action-edit" href="<?php echo $block->getConfigureUrl() ?>" title="<?php echo $block->escapeHtml(__('Edit item parameters')); ?>"> <span> @@ -141,7 +155,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <a href="#" title="<?php echo $block->escapeHtml(__('Remove item')); ?>" - class="action delete" + class="action action-delete" data-post='<?php echo $this->helper('Magento\Checkout\Helper\Cart')->getDeletePostJson($_item); ?>'> <span> <?php echo __('Remove item')?> @@ -150,4 +164,131 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima </div> </td> </tr> + <?php /* Temp MAGETWO-36023 markup */?> + <tr class="item-gift" data-container="item-gift-container"> + <td colspan="<?php echo $cols;?>"> + <div class="gift-options"> + <?php /* Gift Wrapping */ ?> + <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\new-options.phtml')); ?> + + <?php /* Gift Message */ ?> + <?php include ($block->getTemplateFile('Magento_GiftMessage::form.phtml')); ?> + </div> + + <?php /* Gift options applied */ ?> + <div class="gift-summary"> + <?php /* Applied Gift Wrapping */ ?> + <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\applied.phtml')); ?> + + <?php /* Applied Gift Message */ ?> + <?php include ($block->getTemplateFile('Magento_GiftMessage::applied.phtml')); ?> + + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action action-edit" title="Edit"> + <span><?php echo __('Edit'); ?></span> + </button> + <button class="action action-delete" title="Delete"> + <span><?php echo __('Delete'); ?></span> + </button> + </div> + </div> + </div> + <?php /* End Gift options applied */ ?> + </td> + </tr> + + <?php /* Temp js (prototyping only) */ ?> + <script> + require(['jquery'], function($) { + "use strict"; + + var giftWrappingCustom = { + options: { + activeClass: '_active', + giftOptions: '.gift-options', + giftContainer: "[data-container='item-gift-container']", + giftWrappingItem: '.gift-wrapping-item', + giftWrappingPreviewImg: '.gift-wrapping-preview img', + giftSummary: '.gift-summary', + giftWrappingSummaryPrice: '.gift-wrapping-summary .price', + giftPriceItem: '.gift-wrapping-title .price' + }, + init: function() { + if (($(this.options.giftContainer)).data('initialized') != true) { + $(this.options.giftContainer).data('initialized', true); + this.initCollapsible() + .initSlider(); + } + }, + initCollapsible: function() { + var actionGift = $('.action-gift'), + itemGift, + options = this.options; + + + actionGift.on('click', function(e) { + e.preventDefault(); + + itemGift = $(this) + .parents('.item-actions') + .siblings(options.giftContainer); + + $(this).toggleClass(options.activeClass); + itemGift.toggleClass(options.activeClass); + }); + + return this; + }, + initSlider: function() { + var mainImage, + customPrices = [ + '$1.00','$7.00','$33.00','$22.00','$12.0','$4.00' + ], + options = this.options, + listImagesItem, + current, + currentImageSrc; + + $(options.giftWrappingItem).on('click', function() { + current = $(this); + + mainImage = current + .parents(options.giftOptions) + .find(options.giftWrappingPreviewImg); + + listImagesItem = current + .parents(options.giftOptions) + .find(options.giftWrappingItem); + + listImagesItem.removeClass(options.activeClass); + current = $(this).addClass(options.activeClass); + + // Update main image src + currentImageSrc = current + .find('img') + .attr('src'); + + mainImage.attr('src', currentImageSrc); + + // Update item price + current + .parents(options.giftOptions) + .find(options.giftPriceItem) + .text(customPrices[current.index()]); + + // Update summary price + current + .parents(options.giftOptions) + .siblings(options.giftSummary) + .find(options.giftWrappingSummaryPrice) + .text(customPrices[current.index()]); + }); + return this; + } + }; + giftWrappingCustom.init(); + }); + </script> + <?php /* End Temp MAGETWO-36023 markup */?> </tbody> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml new file mode 100644 index 00000000000..e4297826d6a --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml @@ -0,0 +1,18 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +?> + +<?php /* Temp MAGETWO-36023 markup */?> +<?php /* Gift Message Applied */ ?> +<div class="gift-message-summary"> + <span><?php echo __('Message'); ?>:</span> + We think you’ll love this. Happy Birthday! +</div> +<?php /* End Gift Message Applied */ ?> +<?php /* End Temp MAGETWO-36023 markup */?> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml new file mode 100644 index 00000000000..e04693e2704 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml @@ -0,0 +1,78 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +?> + +<?php /* Temp MAGETWO-36023 markup */?> +<?php /* Gift Message */ ?> +<div class="gift-message"> + <div class="gift-options-title"> + <span><?php echo __('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><?php echo __('To'); ?>:</span> + </label> + <div class="control"> + <input type="text" + id="gift-message-whole-to" + title="To" + class="input-text" + name=""> + </div> + </div> + + <div class="field field-from"> + <label for="gift-message-whole-from" + class="label"> + <span><?php echo __('From'); ?>:</span> + </label> + <div class="control"> + <input type="text" + id="gift-message-whole-from" + title="From" + class="input-text" + name=""> + </div> + </div> + + <div class="field text"> + <label for="gift-message-whole-message" + class="label"> + <span><?php echo __('Message'); ?>:</span> + </label> + <div class="control"> + <textarea + id="gift-message-whole-message" + class="input-text" + title="Message" + rows="5" + cols="10" + name=""></textarea> + </div> + </div> + </fieldset> + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action secondary action-update"> + <span><?php echo __('Update'); ?></span> + </button> + <button class="action action-cancel"> + <span><?php echo __('Cancel'); ?></span> + </button> + </div> + </div> + </div> +</div> +<?php /* End Gift Message */ ?> +<?php /* End Temp MAGETWO-36023 markup */?> 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 68018d42759..6a6213c7e1b 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,14 +4,15 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { // -// Shopping cart -//-------------------------------------- +// Shopping cart +// --------------------------------------------- + .cart { // Summary block &-summary { @@ -248,6 +249,20 @@ font-weight: @font-weight__regular; } } + .action-gift { + .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 + ); + } + } .product { &-item-photo { display: block; @@ -272,7 +287,7 @@ content: ":"; } } - // Product options + // Product options .item-options { font-size: @font-size__s; margin-bottom: @indent__s; @@ -310,8 +325,9 @@ } // -// Cross sell -//-------------------------------------- +// Cross sell +// --------------------------------------------- + .block.crosssell { margin-top: 70px; } @@ -319,8 +335,9 @@ } // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .cart { &.table-wrapper { @@ -364,13 +381,15 @@ } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .cart { &-container { &:extend(.abs-add-clearfix-desktop all); - .form-cart { + .form-cart, + .cart-gift-item { &:extend(.abs-shopping-cart-items-desktop all); } .widget { 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 121a06f86bf..84c3626f37a 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,233 @@ // */ // -// Common -//-------------------------------------- +// Variables +// _____________________________________________ + +@gift-message-field-label__color: @color-gray40; +@gift-item-block__border-color: @color-gray-light5; + +// +// Common +// _____________________________________________ & when (@media-common = true) { -.gift-message { - margin: 0; - .fieldset& { - > .legend { - &:extend(.abs-methods-shipping-title all); + .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; - margin: 0 0 @indent__base; - &:before { - display: none; + + .item-gift { + display: none; + &._active { + display: table-row; } } - .activate.message { - display: inline-block; - margin: 0 0 @indent__s; + + .gift-options { + &:extend(.abs-add-clearfix all); } - .product-image-wrapper { - &:extend(.abs-reset-image-wrapper all); + + .gift-options-title { + margin: 0 0 @indent__base; } - .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-options-content { + .fieldset { + margin: 0 0 @indent__base; + } + } + .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) ": "; + } + + // + // Collapsible block + // --------------------------------------------- + + .gift-item-block { + margin: 0; + &._active { + .title { + .icon-font-symbol( + @icon-up, + @_icon-font-position: after + ); } - .price { - font-weight: @font-weight__bold; + } + + .title { + .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 + ); + border-radius: 3px; + font-weight: bold; + &:active { + .css(box-shadow, @button__shadow); } } - .price-including-tax { - .font-size(14); + + .content { + &:extend(.abs-add-clearfix all); + border-bottom: 1px solid @gift-item-block__border-color; + display: none; + padding: @indent__s 0 @indent__base; + position: relative; } } -} -// -// Account order gift message -//-------------------------------------- -.order-details-items { - .order-gift-message, - .block-order-details-gift-message { - .item-options { + // + // 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; + } + } + &:extend(.abs-add-clearfix all); dt { - margin: @indent__s 0; - font-weight: @font-weight__regular; + &:after { + content: ""; + } + } + .label { + &:extend(.abs-colon all); + } + .item-message { + clear: left; } - } - &:extend(.abs-add-clearfix all); - dt:after { - content: ""; - } - .label { - &:extend(.abs-colon all); - } - .item-message { - clear: left; } } -} -.order-details-items .order-items { - .order-gift-message { - &:not(.expanded-content) { - &:extend(.abs-hidden); - } - .action.close { - &:extend(.abs-no-display all); + .order-details-items .order-items { + .order-gift-message { + &:not(.expanded-content) { + &:extend(.abs-hidden); + } + .action.close { + &:extend(.abs-no-display all); + } } - } - .action.show { - padding-right: @indent__base; - position: relative; - .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( - @_icon-font-content: @icon-up, - @_icon-font-position: after + .action.show { + padding-right: @indent__base; + position: relative; + .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( + @_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-top: @border-width__base solid @gift-item-block__border-color; + border-bottom: 0; + .content { + padding-left: 1.5rem; + padding-right: 1.5rem; + } + } } // -// 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); } } } 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 3b102ea7e75..b7994299e80 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,14 +8,15 @@ @cart-item-cell-padding-top: 20px; // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { // -// Shopping cart -//-------------------------------------- +// Shopping cart +// --------------------------------------------- + .checkout-cart-index { .page-main { padding-left: 0; @@ -27,7 +28,7 @@ } } .cart { - // Cart container + // Cart container &-container { .form-cart { &:extend(.abs-shopping-cart-items all); @@ -49,6 +50,12 @@ .block { &:extend(.abs-cart-block all); + .title { + strong { + .font-size(14); + font-weight: @font-weight__semibold; + } + } .item-options { margin: 0 0 16px; .field { @@ -277,26 +284,29 @@ } } - .item { - &-actions td { - padding-bottom: @indent__base; + .item-actions { + td { + padding-bottom: 0; padding-left: @mobile-cart-padding; padding-right: @mobile-cart-padding; white-space: normal; - .actions-toolbar { - &:extend(.abs-add-clearfix all); - } } - .col { - &.item { - display: block; - padding: 15px @mobile-cart-padding @indent__s 90px; - position: relative; - min-height: 75px; - } + .actions-toolbar { + &:extend(.abs-add-clearfix all); + padding-bottom: 15px; + text-align: right; + } + } + .item { + .col.item { + display: block; + padding: 15px @mobile-cart-padding @indent__s 90px; + position: relative; + min-height: 75px; } } .action { + float: left; margin-right: @indent__m; &:last-child { margin-right: 0; @@ -305,14 +315,33 @@ &:extend(.abs-action-button-as-link all); font-weight: @font-weight__regular; } - &.edit { - float: left; - } - &.delete { - float: right; - &:extend(.abs-action-button-as-link all); + } + .action-edit, + .action-delete { + float: none; + .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 { + &:extend(.abs-action-button-as-link all); + .icon-font-symbol( + @_icon-font-content: @icon-trash + ); + } + + .item-gift { + &._active { + border-top: @border-width__base solid @color-gray-light5; } } + .product { &-item-photo { display: block; @@ -369,6 +398,12 @@ border-bottom: @border-width__base solid @border-color__base; .block { &:extend(.abs-cart-block all); + > .title { + strong { + color: @color-blue1; + font-weight: @font-weight__regular; + } + } } .fieldset > .field > .label { display: none; @@ -430,8 +465,9 @@ } // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .cart { &-totals { @@ -469,7 +505,7 @@ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__m) { .cart { - // Cart container + // Cart container &-container { .form-cart { .actions.main { @@ -522,6 +558,28 @@ tbody > tr > td:last-child { border: 0; } + + .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 -16px -15px; + padding: 4px @indent__s 15px 14px; + &:after { + color: @primary__color; + } + } + } } &-totals { @@ -541,27 +599,26 @@ // -// 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 { + padding: 0 @mobile-cart-padding; + margin-top: 70px; + .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 +630,7 @@ } } .cart { - // Cart container + // Cart container &-container { &:extend(.abs-add-clearfix-desktop all); .form-cart { @@ -582,6 +639,10 @@ text-align: right; } } + .cart-gift-item { + &:extend(.abs-shopping-cart-items-desktop all); + margin-bottom: @indent__base; + } .widget { float: left; } @@ -639,9 +700,8 @@ padding: 0; text-align: left; .actions-toolbar { - margin-top: -40px; - padding-left: 185px; position: relative; + text-transform: uppercase; } } } @@ -665,6 +725,24 @@ width: 99%; } } + + .action-gift { + .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; + } + } + } } // Discount 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 0d7da96fe37..f044c57acf3 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,200 +4,252 @@ // */ // -// Common -//-------------------------------------- +// Variables +// _____________________________________________ + +@gift-message-field-label__color: @color-gray40; + +@gift-item-block__border-color: @color-gray-light5; +@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 { - 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; + .gift-message { + margin-bottom: @indent__m; + .actions-toolbar { + .action-cancel { + &:extend(.abs-action-button-as-link all); + display: none; + } + } + .field { + .label { + .css(color, @gift-message-field-label__color); + .css(font-weight, @font-weight__regular); + } + } + } + + .item-gift { + display: none; + &._active { + display: table-row; + } + } + + .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; + } + } + + .gift-summary { position: relative; - .icon-font( - @_icon-font-content: @icon-down, - @_icon-font-size: 10px, - @_icon-font-position: after, - @_icon-font-display: block - ); - &:after { + .actions-toolbar { position: absolute; - right: 12px; + right: 0; top: 0; + > .secondary { + .action { + margin: 0 0 0 @indent__base; + width: auto; + } + } } - &:hover { - .css(color, @filter-link-hover); + .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 + ); } - &.active { - border-bottom: 0; + .action-delete { .icon-font-symbol( - @_icon-font-content: @icon-up, - @_icon-font-position: after + @_icon-font-content: @icon-trash ); } } - .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; - } - } - .order-options { - margin: 0 0 @indent__base; - } - .fieldset { - .field.text { - padding-right: 0; - width: 100%; - .input-text { - height: 90px; + + // + // Collapsible block + // --------------------------------------------- + + .gift-item-block { + border-bottom: 1px solid @gift-item-block__border-color; + margin: 0; + &._active { + .title { + &:after { + content: @gift-item-block-title-icon__active__content; } } } - .field.to { - padding-right: 0; - } - .extra-options-container { - font-weight: @font-weight__regular; - .field.choice { - margin: @indent__base 0 15px; - } + + .title { + color: @gift-item-block-title__color; + cursor: pointer; + margin: 0; + padding: @indent__s @indent__xl @indent__s 15px; + position: relative; + .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 + ); } - } - .options-order-container, - .options-items-container { - margin-bottom: @indent__s; - } - .gift-messages-order { - margin-bottom: 25px; - } - .items { - .list-reset-styles(); - .item { - border-bottom: @border-width__base solid @border-color__base; - padding: 0 0 @indent__base; + + .content { &:extend(.abs-add-clearfix all); + display: none; + 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 { + .item-options { + dt { + margin: @indent__s 0; + font-weight: @font-weight__regular; } } - .name { - .font-size(16); - font-weight: @font-weight__regular; + &:extend(.abs-add-clearfix all); + dt:after { + content: ""; } - .photo.container { - margin: 15px 0; - img { - display: block; - } + .label { + &:extend(.abs-colon all); + } + .item-message { + clear: left; } } } - .regular-price, - .price-including-tax, - .price-excluding-tax { - &:before { - content: attr(data-label) ": "; + + .order-details-items .order-items .order-gift-message { + &:not(.expanded-content) { + &:extend(.abs-hidden); } - .price { - font-weight: @font-weight__bold; + .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); - } - .item-message { - clear: left; - } } -} -.order-details-items .order-items .order-gift-message { - &:not(.expanded-content) { - &:extend(.abs-hidden); - } - .action.close { - &:extend(.abs-no-display all); + .gift-item-block { + border-top: @border-width__base solid @gift-item-block__border-color; + border-bottom: 0; + .title { + &:after { + .font-size(12); + position: absolute; + right: 20px; + top: 10px; + } + } + .content { + padding-left: 1.5rem; + padding-right: 1.5rem; + } } } -} - // -// 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 { + .secondary { + float: right; + .action { + float: right; + margin-left: @indent__base; + } + .action-cancel { + display: block; + float: left; + margin-top: 6px; } } - .options { - overflow: hidden; - } + } + .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; } } } 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 8b5f2b983d6..0d88f1f7d94 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,8 +4,8 @@ // */ // -// Common -//-------------------------------------- +// Common +// _____________________________________________ & when (@media-common = true) { @@ -145,8 +145,9 @@ } // -// Mobile -//-------------------------------------- +// Mobile +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .products-grid.wishlist { .product-item { @@ -226,6 +227,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 +258,9 @@ } // -// Desktop -//-------------------------------------- +// Desktop +// _____________________________________________ + .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .products-grid.wishlist { .product { 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 00d74dcf5d0..cc4ab06b849 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 a6ad436b94d..dbdbeb65ad6 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 GIT binary patch delta 2673 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 delta 1861 zcmZWpeNa?Y6hG&^eebe>?DxKP#RYbk_XMY9Kj1yTmjRnB3Bl4vVu3{wL=bYdbQ;|? zu<64LdPUhxGky3+Y2!>$8ckX`mX#GvGtJmoilqHje}#YPK<Ba8==AQKd(X!`zkA-f z=bks!sS0sQ0$42#i>gUI|2hm;A4vOeT>*g4h}t&yCi}e`zRv()A<1=}$y7hBR+77D z&FSpfyY<RsJU}w(?O$|tB)8y-WH*2_Om?-46#OJ-A=%g;?CRaMX9EahBp)LAlb*iK z$?oPY7Xe(WNp9&)?&%LhH4KsBC@G3}Bzrq<W~Lt@`5Yb6*58-f1w2_m3L19cInett zes390%+SCI($Pku+h6f4!_jQ`IcYYmPB6g|T5}->I2s7Wf0pUDFqQU^yDYK-WR<cK zLSiHzGF8+>m90Wel@<Ir(&^?o&V-(hSXiF#{vGGOOCBj0#g9C4L|~%Ggox~swnbv& zWac=U#$%Cf5=9_`886^_bh;C~be^cjq^L;P%u<dL(_C6WQ+O699=DfTu@xPQ<fL4F z9ko{xueTp+kmYh^)XF1Q%qlR1N	pidu9RAx)B7CEuu9bE`2uDrk#&6XJ0bkI0*j zBbs=Vz;8RjF(ge-4@JiDg6aM3$S6(v^TGnz!Yix@E$AxZm=wn%F3w3>1;&wuu&Pp( zRJY41GW|y(S{31~fu%vgGjApR#yqc|MFP$k+Dn%Ed9P(T=2Th=gF>vtO+oq!%Mi;7 zeG2LoV#uyw`j_AbCj;a7$ED!OGyb1Z?-Pd#@?k!u#4oy>_DI;STbRrJ*4wSM&V>t| z2H`|&P3`nGEUX=^W;(9T2dZF)Ut~UvMO8(W1H7V1bW;*t;Y`Z_;y_E{AmYJ<XJ63+ zuJ&4Ub&Czp4klU#2U`+@({E(F%N8WcZOaaq=}~jpeYtcvc`D4nQ1J5hk-*OAIq%Eu z`FN~mcyUwN`RdD?7E<ZZ?RjUW@Csf4BjhN=p$;~|R!BhxUeJ%3eGZI-jT(v=KjU7G zj*_sd|7PB4ZNBE2mseu3yDa8b%nNgRdv2TXwdgV@^uKex`i)#Wkz>@H*N0BYB~?iX z-wqraz|;TWS9l&_^qKs>xHNM~4rY^Vl48@UGMUWh>GYSGOmPPHBObu%12jK{Gl0`Z zupIbiX7DPWoelQxggNMM6^*i{NldycWxIk6^>RalT;C9^ufHQ{<E87?={GIjl`bka z#Vs<;hg5X4uY+xPlCu_=Bo$w@`W+je;PCN{_zu@x<0*HDC3|rV6FA&jTa!e6y|vMA z<gOkb0ucN%l~ycjlvcntn=-o4s!Cb^!Mf7gJu=d5P-1W}VUS*Ki`lcP?h(A2RVD^U z)3$C*JB%(+S`}~wB#plViD2(I1LOOfjvP7iAM(IJB0)5f$(%loa2tENIIB(!7)exs z;jcJGN$i{}Qg=4UfNM5zdLK$if5q`&ff_?-N~fC)YE0=j9cwMAMjXp3n$oURqn>ou zFKtX2w}Ui9yoAG4RNzqfQbl!3b`xt&Ag+4!xmHVf`rKn!TR(kf$=dy=bUa~e)2E!z z28>olG=`V=wOUr(fIOqm0sK@jL@hJB>K7%A3xRI)oHBZ_QMOL-!Nc%0yo)C6$4|Ke z&dY_ke(p8y8{W-t<e%b)_+zFmf>V$MRhSfRiTR>eTqIVC^<umDlK7!G!E%_Fm9wL4 zGG|Fnx0y2+n%fB5h$jSx^%e7#v~x~2(pCV?vo@m%JE44zHxb`G#|z*l$?yjdDaKWE zd@fYNexqrd%%m|evwRja%V#mOd=``VN^;18W(^`aubFesg4V%q=!GQQ1NXyb=z|@Q i8r~=Ab>4^{)<Xx~@NVcK`%Ze-|J$j5=dIFlLD9c|hIt<V 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 171e99f6461..d62bf73f9cb 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,54 @@ -<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 +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata>Generated by IcoMoon</metadata> +<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 GIT binary patch delta 2671 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 delta 1878 zcmZWpeQZ-z6hG&^zW3T~v|YbmDO<O--Fs|k>BrXcUECldn`IN3VXo^s7~9Im=86g$ z*0K!~&BWm|Q)2u><PQZy0#k5CJ|t5#n9P`%U>0Fa@Gt)`QU6iWdEPn<#CLP<Js<D< z?z!ildw#E)@}>a+ARjWof^XaQl>x2m-YwF6LDaUZH_`9d@m&T0i%72TOr-j0HIm## ztG2V};GSD^5jV-CH(lxKNbJUSi6nr<NA^$`DcCv2K(hM3r>l4WfgQk2k~~WCXFYwp z9!n%!cHaQ7ZX!i%Z{k2dY=kkAPm)}^FVWlaPbT{e$y2mRTYq0_KLtvk=uz#!GH~ol zWOD`1&eOnIQqg}z_rKBwhM`$?v(T(sEueu_wB~^p7#awrzg8&qm`XdzUE&2j3RRNq zMPfuJ3L!qshlC9n4oNb8>hH9%45LANN6;rNwf&5X-;7=K1n?8P<mUvQ7dXFU7rXtz zX)-emP18Ytw@494pu_9<5$$dP2kpm)f?|LtY{5{8q7b%*-C>y(BE;j~awEpkyj)61 zm3J}xHsam((FRGXlqcF4WJ-mV=tWtN28N>MZ6!#PXbX{Vz!tWJg36F4yn@vrp4PC4 ztmZVLhShLv_Zdb&()9FDWDLt`KHiH0rAe95ERzhZER>)DttE^gMzDm5Fk*NmMo{o# zbyY|V*{l{`P@G(#+Rqx@t38~3$$C1*5{FChyDdR9m92HL4#Qg1RvC&sT(HbWK{|^n z5G#tDGAe1#Ymzbjqvz~-_cZ=8<2irH^#dxGxiNhKETxpVc&o+a_nDM9Z?(ODB3^4L zF1DzIv+<hR>>VtsofzX4tSbN!!0h4$Ck6u{IV8DRIV{pmiFAeYt;2}Jt+6ABM`HFv zC0niSwYrV1g?M!&);coM8XL*JmvO9F7ON~=bF@Mk(pEg4N1KzUET|YV-rPIx9tcc1 z-fAzvQ#Hp{G*?{Pcynhll@8sWWByOPh1Wq1IRFu;hn=toQjmeymA|!4Gx~jM4f)l> z*w&)C%okD~(G3_|?%0>)ml;e}gD#HwK1MmGYvaD=t-6@9KF^_S&NC62CwAubp+&Tc z)gr>T!=uA^@elk8uOUp_$p4K=3s%uA6pDqSTo|s-WHOi2=`S;x(hLqF9>(lpnul;6 zFsla3fOCExZ{yX4U>{DHnNBN*DQjU-5Fbj}eosSGYG{z64W4N9fuv2BZ`-ES864}a zRBW=17s5`YqFZ<!!j6|2qh2G1@C~EO-1H)YFErr?OiPWu(#)3~#4Q5H;GWu=1S%&C zjV?8JQP>W^xg;vBU_dP`ci}?H=t8TjB&FE6-k2O8PpT9f8HuT+ykrcTa;oGw-p(mw zBNNlcB&N-37bvfGTis%qeE^AIAJ_vUgU!c}AO8<|csLd#n$2V`UPQQ$oh{9&W5a3^ zWf1TuoTManE*7aR7o^*|5IDUL*{j?&J*f``5t`HKW|bOKN}ajRkZQ!qoT52xO*JZK z&C%73DfM=c29Gm%jEV}(GFvW(Y@$gc#AApXo_#HD@MWi-!`f)}(yF?_3kseoY*RK_ zUUjRjjA#;X9*P^*{RR1Ip9A<_KSmuhw<^oUFyjR!Azn~huv)ejaKh8@3Vetf?8na; zJ>y`!Oh5Au^9^fbo7f?Cj6J2<%~?2!3vqMYJ-&c<@XPrsKFYWAZ}R8(SwSl}gi7J0 zFsEImP3jn3k*<xf)p)#cR2j9)Y0ILlrcDnm3pTY0TcC20*ASmv<T<dBr1}H!6yt_P zJ`bv3P;J^89cfg|9G}C?@j1*KpTi`6D>>vqa|WKAw=6p6K<nXo=!FD43Qxc;=!1Rq ta+{z7259YGkW0Z&$MGreE)BTgDKd4EOAomW&{O}Pv*K`6D~*nle*ugZcK-kX 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 GIT binary patch literal 6844 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 literal 5516 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 aJ(i`Y+ac^l9_`n&XvupwAAA27um1&I!S<m5 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 GIT binary patch literal 3272 zcmV;(3^((4Pew8T0RR9101U_g3jhEB02*8X01SKp0RR9100000000000000000000 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 Gh5-eP{3X=@ literal 2948 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 diff --git a/app/design/frontend/Magento/luma/web/fonts/selection.json b/app/design/frontend/Magento/luma/web/fonts/selection.json index 11b601ea649..2c4a03883a1 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/lib/web/css/docs/docs.css b/lib/web/css/docs/docs.css index c582689347e..bd3fb54a737 100644 --- a/lib/web/css/docs/docs.css +++ b/lib/web/css/docs/docs.css @@ -8193,7 +8193,6 @@ pre { margin: 0 0 10px; line-height: 1.42857143; padding: 10px; - word-break: break-all; word-wrap: break-word; } pre code { @@ -8258,8 +8257,6 @@ cite { line-height: 3rem; } .example-word-wrap { - word-break: break-all; - word-break: break-word; word-wrap: break-word; -webkit-hyphens: auto; -moz-hyphens: auto; @@ -8562,7 +8559,6 @@ pre { margin: 0 0 10px; line-height: 1.42857143; padding: 10px; - word-break: break-all; word-wrap: break-word; } pre code { @@ -8732,4 +8728,4 @@ body { padding: 15px; background-image: none; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL191dGlsaXRpZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9icmVhZGNydW1icy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2JyZWFkY3J1bWJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2ljb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX3R5cG9ncmFwaHkubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9pY29ucy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2J1dHRvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19idXR0b25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZm9ybXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19mb3Jtcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19sb2FkZXJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9tZXNzYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX21lc3NhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZ3JpZHMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9wYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3BhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmVzcG9uc2l2ZS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3NlY3Rpb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fc2VjdGlvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL190YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90b29sdGlwcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3Rvb2x0aXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3V0aWxpdGllcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2RvY3MubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpREksZ0JBQUM7QUFDRCxnQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGNBQUE7O0FBRUosZ0JBQUM7RUFDRyxXQUFBOztBQ25CUixnQkMyQ0k7RUFDSSxXQUFBOztBRDVDUixnQkM4Q0k7RUFDSSxZQUFBOztBRC9DUixnQkNWSTtBRFVKLGdCQ1RJO0VBQ0ks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 */ \ No newline at end of file +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL191dGlsaXRpZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19hY3Rpb25zLXRvb2xiYXIubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9icmVhZGNydW1icy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2JyZWFkY3J1bWJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX2ljb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX3R5cG9ncmFwaHkubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9pY29ucy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2J1dHRvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19idXR0b25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZHJvcGRvd25zLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvZm9ybXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19mb3Jtcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL19sb2FkZXJzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi92YXJpYWJsZXMvX2xvYWRlcnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9tZXNzYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX21lc3NhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fbGF5b3V0Lmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fZ3JpZHMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS9wYWdlcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3BhZ2VzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcG9wdXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fcmF0aW5nLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvcmVzcG9uc2l2ZS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3NlY3Rpb25zLmxlc3MiLCIvbGliL3dlYi9jc3Mvc291cmNlL2xpYi9fc2VjdGlvbnMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9zb3VyY2UvbGliL190YWJsZXMubGVzcyIsIi9saWIvd2ViL2Nzcy9kb2NzL3NvdXJjZS90b29sdGlwcy5sZXNzIiwiL2xpYi93ZWIvY3NzL3NvdXJjZS9saWIvX3Rvb2x0aXBzLmxlc3MiLCIvbGliL3dlYi9jc3MvZG9jcy9zb3VyY2UvdHlwb2dyYXBoeS5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL3V0aWxpdGllcy5sZXNzIiwiL2xpYi93ZWIvY3NzL2RvY3Mvc291cmNlL2RvY3MubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpREksZ0JBQUM7QUFDRCxnQkFBQztFQUNHLFNBQVMsRUFBVDtFQUNBLGNBQUE7O0FBRUosZ0JBQUM7RUFDRyxXQUFBOztBQ25CUixnQkMyQ0k7RUFDSSxXQUFBOztBRDVDUixnQkM4Q0k7RUFDSSxZQUFBOztBRC9DUixnQkNWSTtBRFVKLGdCQ1RJO0VBQ0ks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 */ \ No newline at end of file diff --git a/lib/web/css/docs/icons.html b/lib/web/css/docs/icons.html index c20166dc31e..7058b1369e7 100644 --- a/lib/web/css/docs/icons.html +++ b/lib/web/css/docs/icons.html @@ -1,12 +1,12 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> - +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> + <!DOCTYPE html><html><head><title>icons | Magento UI Library -</title><meta charset="utf-8"><style>*{-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;border:0}body{padding:60px 0 40px;background-color:hsl(207,10%,90%);color:hsl(207,5%,30%)}.container{max-width:1300px;margin:0 auto;padding:0 20px}.section{position:relative;margin-bottom:20px}.docs{position:relative;z-index:2;width:68%;min-height:200px;background-color:hsl(207,0%,100%);background-clip:padding-box;border:1px solid hsla(207,5%,5%,.1);border-radius:5px;box-shadow:0 0 3px hsla(207,5%,5%,.1)}.code{position:absolute;top:5px;bottom:5px;right:0;z-index:1;width:33%;padding:10px 10px 10px 20px;border-radius:0 5px 5px 0;border:1px solid hsla(207,20%,10%,.1);background-color:hsla(207,20%,95%,.9);background-clip:padding-box;opacity:.5;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.code:hover{opacity:1}.preview{background:hsl(207,0%,100%);border-top:1px solid hsl(207,30%,95%);position:relative;z-index:1}.preview-code+.preview{margin-top:0;border-top:0}.preview iframe{display:block;width:100%;height:100%;overflow:hidden}.preview-code{position:relative;z-index:2;display:block;width:100%;color:hsl(207,9%,37%);max-height:200px;padding:10px 20px;overflow-y:auto;background:hsl(207,30%,95%);border:1px solid hsl(207,30%,85%);border-left:0;border-right;box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1);line-height:1.1!important;resize:none}.preview-code:focus{outline:0;background:hsl(207,30%,97%);box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1),0 0 5px hsla(207,75%,75%,.9)}.preview-code:last-child{border-bottom:0;border-radius:0 0 5px 5px}.resizeable{padding:15px;overflow:auto;background:hsl(207,0%,100%);box-shadow:0 0 2px hsla(207,10%,20%,.2);resize:both}.preview-code,pre{white-space:pre-wrap;word-wrap:break-word;overflow-y:auto}.code pre{height:100%;margin-top:0}.bar{position:fixed;left:0;right:0;z-index:1010;min-height:40px;line-height:40px;background-image:-webkit-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-moz-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-o-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92))}.bar.top{top:0;box-shadow:0 1px 2px hsla(207,5%,0%,.2)}.bar.bottom{bottom:0;box-shadow:0 -1px 2px hsla(207,5%,0%,.2)}.bar ul{margin:0!important}.bar li{display:block;list-style:none}.bar .icon path{fill:hsla(27,10%,75%,.75)}.docs .icon path{fill:hsla(207,10%,75%,.5)}.docs .permalink:hover .icon path{fill:hsl(207,10%,75%)}.bar button{color:hsla(27,10%,75%,.75)}.bar button:hover .icon path,.bar button.is-active .icon path{fill:hsl(27,10%,85%)}.bar button:hover,.bar button.is-active{color:hsl(27,10%,85%)}.bar .icon{vertical-align:middle;display:inline-block}.bar,.bar a,.bar a:visited{color:hsl(27,10%,85%);text-shadow:1px 1px 0 hsla(27,5%,0%,.5)}.bar a:hover,.bar a.is-active{color:hsl(27,10%,95%);text-shadow:1px 1px 0 hsla(27,5%,0%,1);text-decoration:none}.brand{float:left;margin-right:20px;font-weight:700;font-size:16px;text-decoration:none}.brand,a.brand,a.brand:visited{color:hsl(27,5%,5%);text-shadow:1px 1px 0 hsla(27,5%,100%,.2)}.brand:hover,a.brand:hover{color:hsl(27,5%,0%);text-shadow:1px 1px 0 hsla(27,5%,100%,.3);text-decoration:none}.menu{font-size:12px}.menu>li{float:left;position:relative}.menu a{display:block;margin-right:15px}.dropdown-toggle{position:relative;padding-right:15px}.dropdown-toggle:after{display:block;position:absolute;right:0;top:18px;content:'';border:4px solid;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.nav-results,.dropdown{position:absolute;z-index:1020;top:32px;left:-16px;width:175px;max-height:500px;padding:10px 0;overflow-y:auto;word-wrap:break-word;font-size:11px;line-height:20px;background-color:hsla(207,10%,25%,.97);border:1px solid hsla(207,5%,70%,.3);border-radius:3px;box-shadow:0 0 3px hsla(207,5%,0%,.2)}.toc-list{width:200px}.nav-results{right:0;width:200px;left:auto;padding:5px 0}.nav-results-filename{display:block;font-size:10px;opacity:.75}.nav-results a{display:block;line-height:15px;padding:5px 10px}.nav-results li:not([hidden])~li a{border-top:1px solid hsla(27,10%,90%,.1)}.dropdown a{padding:0 15px}.dropdown li:hover{background-color:hsl(207,10%,22%)}.nav{float:right;position:relative}.nav input[type="search"]{padding:2px 4px;color:#fff;width:150px;border:1px solid hsla(207,5%,0%,.3);background:hsla(207,12%,40%,.9);box-shadow:inset 1px 1px 3px hsla(207,5%,0%,.05),1px 1px 0 hsla(207,5%,100%,.05);border-radius:10px;-webkit-appearance:textfield}.nav input[type="search"]:focus{outline:0;background:hsla(207,7%,45%,.9)}.settings{text-align:center}.bar button{display:inline-block;vertical-align:middle;padding:0 5px;margin:0 3px;background:transparent}.bar button:first-child{margin-left:0}.settings .auto{line-height:32px;font-size:11px;font-weight:700;letter-spacing:-1px;text-shadow:none;text-transform:uppercase}body{font-family:sans-serif;font-size:14px;line-height:1.618}.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-left:20px;margin-right:20px}.preview,.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-top:10px}ul ul,ol ol,ul ol,ol ul,blockquote p:last-child{margin-top:0}ul,ol{padding-left:1.5em}p:last-child,ol:last-child,ul:last-child,dl:last-child{margin-bottom:20px}hr,h1,h2,h3,h4,h5,h6{margin:1em 20px .5em}h1:first-of-type{margin-top:20px}h1,h2,h3,h4,h5,h6{line-height:1.2;color:hsl(207,10%,50%)}h1 a,h1 a:hover,h1 a:visited{color:inherit;text-decoration:inherit}h1{font-size:3.052em;font-weight:400;color:hsl(207,10%,45%)}h2{font-size:1.953em}h3{font-size:1.536em}h1,h2,h3{letter-spacing:-.025em}h4{font-size:1.25em}h5{font-size:1em;text-transform:uppercase}h6{font-size:1em}.permalink{position:absolute;top:15px;right:15px}a{color:hsl(207,90%,50%);text-decoration:none}a:hover{color:hsl(207,95%,40%);text-decoration:underline}a:visited{color:hsl(207,100%,35%)}.preview-code,pre,code,var{font-style:normal;font-family:"Ubuntu Mono","Andale Mono","DejaVu Sans Mono","Monaco","Bitstream Vera Sans Mono","Consolas","Lucida Console",monospace;font-size:12px}.docs pre,code,var{padding:.1em 3px;background:hsla(207,5%,0%,.025);border:1px solid hsla(207,5%,0%,.05);border-radius:3px}.code pre{line-height:1.1!important}pre code{padding:0;background:transparent;border:0}.cf:before,.cf:after{content:'';display:table}.cf:after{clear:both}[unselectable="on"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[hidden]{display:none!important}small{font-size:85%;opacity:.9}.docs .vars_list{width:100%}.docs .vars_list th,.docs .vars_list td{width:33%}.docs pre th{text-align:left}.docs pre table{border-collapse:collapse;margin:0}.docs th,.docs td{border:0;padding:9px 10px 9px 0;vertical-align:top}.docs tr th:last-child,.docs tr td:last-child{padding-right:0}.docs pre th{font-weight:400}.docs pre th.vars_head{border-bottom:1px solid #e5e5e5;color:#707070;white-space:nowrap}.docs pre th.vars_section{border-bottom:1px solid #e5e5e5;color:#333;font-size:18px;padding-top:30px}.vars_value{color:#338bb8}.docs li p{margin:0 0 20px}.dropdown a{text-transform:capitalize}#default-button #default-button-big+.preview+.preview-code{display:block}#actions-toolbar-alignment .preview-code,#reverse-primary-and-secondary-blocks .preview-code,#actions-toolbar-indents-customizations .preview-code,#actionstoolbarclearfloats-mixin .preview-code,#responsive-actions-toolbar .preview-code,#button-with-gradient-background .preview-code,#primary-button .preview-code,#button-as-an-icon .preview-code,#button-with-an-icon-on-the-left-or-right-side-of-the-text .preview-code,#button-with-fixed-width .preview-code,#button-as-a-link .preview-code,#link-as-a-button .preview-code,#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol .preview-code,#breadcrumbs-with-solid-background .preview-code,#pagination-without-label-with-solid-background .preview-code,#pagination-with-label-and-text-previousnext-links .preview-code,#pagination-with-label-and-gradient-background-on-links .preview-code,#fixed-height-popup .preview-code,#fixed-content-height-popup .preview-code,#margins-for-header-content-and-footer-block-in-popup .preview-code,#popup-titles-with-styled-as-theme-headings .preview-code,#popup-action-toolbar .preview-code,#popup-close-button-without-an-icon .preview-code,#modify-icon-of-popup-close-button .preview-code,#modify-overlay-styles .preview-code,#rating-summary-multiple-ratings .preview-code,#rating-summary-hide-label .preview-code,#rating-summary-icons-symbol .preview-code,#rating-summary-icons-color .preview-code,#rating-summary-set-number-of-icons .preview-code,#rating-summary .preview-code,#rating-with-vote-icon-symbol .preview-code,#rating-with-vote-setup-icons-colors .preview-code,#rating-with-vote-setup-number-of-icons .preview-code,#tabs-with-content-top-border .preview-code,#accordion-mixin-variables .preview-code,#tabs-base .preview-code,#accordion-base .preview-code,#warning-message .preview-code,#error-message .preview-code,#success-message .preview-code,#notice-message .preview-code,#message-with-inner-icon .preview-code,#message-with-lateral-icon .preview-code,#custom-message-style .preview-code,#modify-dropdown-list-styles .preview-code,#dropdown-with-icon-customization .preview-code,#split-button-button-styling .preview-code,#split-button-icon-customization .preview-code,#split-button-dropdown-list-customization .preview-code,#table-cells-resize .preview-code,#table-caption .preview-code,#table-typography .preview-code,#table-background-customization .preview-code,#table-borders-customization .preview-code,#table-without-borders .preview-code,#table-with-horizontal-borders .preview-code,#table-with-vertical-borders .preview-code,#striped-table .preview-code,#responsive-table-technics-1 .preview-code,#responsive-table-technics-2 .preview-code,#fontsize-mixin .preview-code,#word-breaking-mixin .preview-code,#word-breaking-mixin .preview-code,#text-overflow-mixin .preview-code,#text-hide .preview-code,#hyphens .preview-code,#font-style-and-color .preview-code,#reset-list-styles .preview-code,#inlineblock-list-item-styling .preview-code,#link-styling-mixin .preview-code,#heading-styling-mixin .preview-code,#icon-with-image-or-sprite .preview-code,#change-the-size-of-font-icon .preview-code,#sprite-and-font-icons-for-blank-theme .preview-code,#icon-position-for-an-icon-with-image-or-sprite .preview-code{display:none}article[id$="-variables"] .docs,#resets .docs,#ratings .docs,#tabs-and-accordions .docs,#messages .docs,#dropdown-and-split-buttons-mixins .docs,#font-face-mixin .docs,#layout .docs,#forms-mixins .docs,#including-magento-ui-library-to-your-theme .docs,#global-forms-elements-customization .docs,#mobile-off-canvas-navigation .docs,#desktop-navigation .docs,#layout-width .docs{width:100%}article[id$="-variables"] .code{display:none}article[id$="-variables"] .docs pre{background:#fff;border:0;margin-top:0}</style><script type="text/preview">(function(){"use strict";var a=function(a){return Array.prototype.slice.call(a)},b=document.getElementsByTagName("body")[0],c=["link","visited","hover","active","focus","target","enabled","disabled","checked"],d=new RegExp(":(("+c.join(")|(")+"))","gi"),e=a(document.styleSheets).map(function(b){return a(b.cssRules).filter(function(a){return a.selectorText&&a.selectorText.match(d)}).map(function(a){return a.cssText.replace(d,".\\3A $1")}).join("")}).join("");if(e.length){var f=document.createElement("style");f.innerText=e;var g=document.getElementsByTagName("style")[0];g.parentNode.insertBefore(f,g)}var h=function(){var a=window.getComputedStyle(b,null);return function(){if(b.childElementCount===0)return b.offsetHeight;var c=b.getElementsByTagName("*"),d=[];for(var e=0,f=c.length;e<f;e++)d.push(c[e].offsetTop+c[e].offsetHeight+parseInt(window.getComputedStyle(c[e],null).getPropertyValue("margin-bottom")));var g=Math.max.apply(Math,d);return g+=parseInt(a.getPropertyValue("padding-bottom"),10),Math.max(g,b.offsetHeight)}}(),i={getHeight:function(){window.parent.postMessage({height:h()},"*")}};window.addEventListener("message",function(a){if(a.data==null)return;typeof a.data=="string"&&i[a.data]()},!1)})()</script><style type="text/preview">.actions-toolbar:before,.actions-toolbar:after{content:"";display:table}.actions-toolbar:after{clear:both}.actions-toolbar .primary{float:left}.actions-toolbar .secondary{float:right}.actions-toolbar .primary,.actions-toolbar .secondary{display:inline-block}.actions-toolbar .primary a.action,.actions-toolbar .secondary a.action{display:inline-block}.actions-toolbar .primary .action{margin:0 5px 0 0}.actions-toolbar .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-2:before,.example-actions-toolbar-2:after{content:"";display:table}.example-actions-toolbar-2:after{clear:both}.example-actions-toolbar-2 .primary{float:left}.example-actions-toolbar-2 .secondary{float:right}.example-actions-toolbar-2 .primary,.example-actions-toolbar-2 .secondary{display:inline-block}.example-actions-toolbar-2 .primary a.action,.example-actions-toolbar-2 .secondary a.action{display:inline-block}.example-actions-toolbar-2 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-2 .secondary a.action{margin-top:6px}.example-actions-toolbar-3{text-align:left}.example-actions-toolbar-3:before,.example-actions-toolbar-3:after{content:"";display:table}.example-actions-toolbar-3:after{clear:both}.example-actions-toolbar-3 .primary{float:left}.example-actions-toolbar-3 .primary,.example-actions-toolbar-3 .secondary{display:inline-block}.example-actions-toolbar-3 .primary a.action,.example-actions-toolbar-3 .secondary a.action{display:inline-block}.example-actions-toolbar-3 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-3 .secondary a.action{margin-top:6px}.example-actions-toolbar-4{text-align:right}.example-actions-toolbar-4:before,.example-actions-toolbar-4:after{content:"";display:table}.example-actions-toolbar-4:after{clear:both}.example-actions-toolbar-4 .secondary{float:right}.example-actions-toolbar-4 .primary,.example-actions-toolbar-4 .secondary{display:inline-block}.example-actions-toolbar-4 .primary a.action,.example-actions-toolbar-4 .secondary a.action{display:inline-block}.example-actions-toolbar-4 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-4 .secondary a.action{margin-top:6px}.example-actions-toolbar-5{text-align:center}.example-actions-toolbar-5:before,.example-actions-toolbar-5:after{content:"";display:table}.example-actions-toolbar-5:after{clear:both}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{vertical-align:top}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{display:inline-block}.example-actions-toolbar-5 .primary a.action,.example-actions-toolbar-5 .secondary a.action{display:inline-block}.example-actions-toolbar-5 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-5 .secondary a.action{margin-top:6px}.example-actions-toolbar-6:before,.example-actions-toolbar-6:after{content:"";display:table}.example-actions-toolbar-6:after{clear:both}.example-actions-toolbar-6 .primary{float:right}.example-actions-toolbar-6 .secondary{float:left}.example-actions-toolbar-6 .primary,.example-actions-toolbar-6 .secondary{display:inline-block}.example-actions-toolbar-6 .primary a.action,.example-actions-toolbar-6 .secondary a.action{display:inline-block}.example-actions-toolbar-6 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-6 .secondary a.action{margin-top:6px}.example-actions-toolbar-7{text-align:left}.example-actions-toolbar-7:before,.example-actions-toolbar-7:after{content:"";display:table}.example-actions-toolbar-7:after{clear:both}.example-actions-toolbar-7 .secondary{float:left}.example-actions-toolbar-7 .primary,.example-actions-toolbar-7 .secondary{display:inline-block}.example-actions-toolbar-7 .primary a.action,.example-actions-toolbar-7 .secondary a.action{display:inline-block}.example-actions-toolbar-7 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-7 .secondary a.action{margin-top:6px}.example-actions-toolbar-8{text-align:right}.example-actions-toolbar-8:before,.example-actions-toolbar-8:after{content:"";display:table}.example-actions-toolbar-8:after{clear:both}.example-actions-toolbar-8 .primary{float:right}.example-actions-toolbar-8 .primary,.example-actions-toolbar-8 .secondary{display:inline-block}.example-actions-toolbar-8 .primary a.action,.example-actions-toolbar-8 .secondary a.action{display:inline-block}.example-actions-toolbar-8 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-8 .secondary a.action{margin-top:6px}.example-actions-toolbar-9{margin:10px;padding:10px}.example-actions-toolbar-9:before,.example-actions-toolbar-9:after{content:"";display:table}.example-actions-toolbar-9:after{clear:both}.example-actions-toolbar-9 .primary{float:left}.example-actions-toolbar-9 .secondary{float:right}.example-actions-toolbar-9 .primary,.example-actions-toolbar-9 .secondary{display:inline-block}.example-actions-toolbar-9 .primary a.action,.example-actions-toolbar-9 .secondary a.action{display:inline-block}.example-actions-toolbar-9 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-9 .secondary a.action{margin-top:6px}.example-actions-toolbar-10{text-align:left}.example-actions-toolbar-10:before,.example-actions-toolbar-10:after{content:"";display:table}.example-actions-toolbar-10:after{clear:both}.example-actions-toolbar-10 .primary{float:left}.example-actions-toolbar-10 .primary,.example-actions-toolbar-10 .secondary{display:inline-block}.example-actions-toolbar-10 .primary a.action,.example-actions-toolbar-10 .secondary a.action{display:inline-block}.example-actions-toolbar-10 .primary .action{margin:0 50px 0 0}.example-actions-toolbar-10 .secondary a.action{margin-top:6px}.example-actions-toolbar-11{text-align:left}.example-actions-toolbar-11:before,.example-actions-toolbar-11:after{content:"";display:table}.example-actions-toolbar-11:after{clear:both}.example-actions-toolbar-11 .primary{float:left}.example-actions-toolbar-11 .primary,.example-actions-toolbar-11 .secondary{display:inline-block}.example-actions-toolbar-11 .primary a.action,.example-actions-toolbar-11 .secondary a.action{display:inline-block}.example-actions-toolbar-11 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-11 .secondary .action{margin:0 50px 0 0}.example-actions-toolbar-11 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}@media only screen and (max-width: 768px){.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{ display:block;float:none}}.example-breadcrumbs-1{margin:0 0 20px}.example-breadcrumbs-1 .items{font-size:1.2rem;color:#a3a3a3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-1 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-1 .item{margin:0}.example-breadcrumbs-1 a{color:#333;text-decoration:none}.example-breadcrumbs-1 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-1 a:hover{color:#333;text-decoration:underline}.example-breadcrumbs-1 a:active{color:#333;text-decoration:none}.example-breadcrumbs-1 strong{font-weight:400}.example-breadcrumbs-1 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-1 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-2{margin:0 0 20px}.example-breadcrumbs-2 .items{font-size:1.2rem;color:#1979c3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-2 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-2 .item{margin:0}.example-breadcrumbs-2 a{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #ccc;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-2 a:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 strong{background-color:#ff5501;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f7b32e 0, #ff5501 100%);background-image:linear-gradient(to bottom, #f7b32e 0, #ff5501 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b32e', endColorstr='#ff5501', GradientType=0);border:1px solid #d04b0a;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-2 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-2 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3{margin:0 0 20px}.example-breadcrumbs-3 .items{font-size:1.2rem;color:#333;margin:0;padding:0;list-style:none none}.example-breadcrumbs-3 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-3 .item{margin:0}.example-breadcrumbs-3 a{background:#f4f4f4;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-3 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-3 a:hover{background:#ccc;color:#333;text-decoration:none}.example-breadcrumbs-3 a:active{color:#333;text-decoration:none}.example-breadcrumbs-3 strong{background:#e7e7e7;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-3 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-3 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3 .item a{position:relative;margin:0 11px 0 0}.example-breadcrumbs-3 .item a:after{border:12px solid transparent;height:0;width:0;border-left-color:#f4f4f4;content:"";position:absolute;display:block;top:0;right:-23px}.example-breadcrumbs-3 .item a:hover:after{border-color:transparent transparent transparent #ccc}button{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}button:focus,button:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}button:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}button.disabled,button[disabled],fieldset[disabled] button{cursor:default;pointer-events:none;opacity:.5}button:active,button:focus{box-shadow:inset 0 2px 1px rgba(0,0,0,.12)}.example-button-1.example-button-2{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-button-1.example-button-3{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;border-radius:0;color:#000}.example-button-1.example-button-3:hover,.example-button-1.example-button-3.active{color:#000}.example-button-10{background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-10>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-button-10:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-10:hover:before{color:inherit}.example-button-10:active:before{color:inherit}.example-button-10:focus,.example-button-10:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-10:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:default;pointer-events:none;opacity:.5}.example-button-10:focus,.example-button-10:active{background:0;border:0}.example-button-10:hover{background:0;border:0}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-11{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-11:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-11:hover:before{color:inherit}.example-button-11:active:before{color:inherit}.example-button-11:focus,.example-button-11:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-11:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-11.disabled,.example-button-11[disabled],fieldset[disabled] .example-button-11{cursor:default;pointer-events:none;opacity:.5}.example-button-12{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-12:after{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-12:hover:after{color:inherit}.example-button-12:active:after{color:inherit}.example-button-12:focus,.example-button-12:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-12:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-12.disabled,.example-button-12[disabled],fieldset[disabled] .example-button-12{cursor:default;pointer-events:none;opacity:.5}.example-button-13{background-image:none;background:#f2f2f2;padding:7px 15px;width:100px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-13:focus,.example-button-13:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-13:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-13.disabled,.example-button-13[disabled],fieldset[disabled] .example-button-13{cursor:default;pointer-events:none;opacity:.5}.example-button-4{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-4:focus,.example-button-4:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4.disabled,.example-button-4[disabled],fieldset[disabled] .example-button-4{cursor:default;pointer-events:none;opacity:.5}.example-button-4:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-4.example-button-5{line-height:2.2rem;padding:7px 35px;font-size:1.8rem}.example-button-4.example-button-6{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;color:#fff}.example-button-4.example-button-6:hover,.example-button-4.example-button-6.active{color:#fff}.example-button-7{background-image:none;background:#f2f2f2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #1979c3 0, #006bb4 100%);background-image:linear-gradient(to bottom, #1979c3 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1979c3', endColorstr='#006bb4', GradientType=0);padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}.example-button-7:focus,.example-button-7:active{background:#e2e2e2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #006bb4 100%);background-image:linear-gradient(to bottom, #006bb4 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#006bb4', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7:hover{background:#e2e2e2;background-color:#1979c3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #1979c3 100%);background-image:linear-gradient(to bottom, #006bb4 0, #1979c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#1979c3', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7.disabled,.example-button-7[disabled],fieldset[disabled] .example-button-7{cursor:default;pointer-events:none;opacity:.5}.example-button-7:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-8{background:0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;font-weight:400}.example-button-8:visited{color:#1979c3;text-decoration:none}.example-button-8:hover{color:#006bb4;text-decoration:underline}.example-button-8:active{color:#ff5501;text-decoration:underline}.example-button-8:hover{color:#006bb4}.example-button-8:hover,.example-button-8:active,.example-button-8:focus{background:0;border:0}.example-button-8.disabled,.example-button-8[disabled],fieldset[disabled] .example-button-8{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.example-button-8:active{box-shadow:none}.example-button-9{text-decoration:none;background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:0;vertical-align:middle;margin:3px;border-radius:3px;font-weight:700}.example-button-9:hover,.example-button-9:active,.example-button-9:focus{text-decoration:none}.example-button-9:focus,.example-button-9:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-9:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-9.disabled,.example-button-9[disabled],fieldset[disabled] .example-button-9{cursor:default;pointer-events:none;opacity:.5}.example-button-9:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-14{background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-14:focus,.example-button-14:active{background:0;border:0}.example-button-14:hover{background:0;border:0}.example-button-14.disabled,.example-button-14[disabled],fieldset[disabled] .example-button-14{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-15{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;vertical-align:middle;background:#f2f2f2;color:#333;border:1px solid #cdcdcd}.example-button-15:focus,.example-button-15:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15.disabled,.example-button-15[disabled],fieldset[disabled] .example-button-15{cursor:default;pointer-events:none;opacity:.5}.example-button-15:focus,.example-button-15:active{background:#e2e2e2;color:#333;border:1px solid #cdcdcd}.example-button-15:hover{background:#e2e2e2;color:#555;border:1px solid #cdcdcd}.example-button-17{line-height:2.2rem;padding:14px 17px;font-size:1.8rem;font-size:1.4rem;line-height:1.6rem;padding:7px 15px}.example-button-18{font-size:1rem;line-height:1.2rem;padding:4px 10px}.example-dropdown-1{display:inline-block;position:relative}.example-dropdown-1:before,.example-dropdown-1:after{content:"";display:table}.example-dropdown-1:after{clear:both}.example-dropdown-1 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle:hover:after{color:inherit}.example-dropdown-1 .action.toggle:active:after{color:inherit}.example-dropdown-1 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle.active:hover:after{color:inherit}.example-dropdown-1 .action.toggle.active:active:after{color:inherit}.example-dropdown-1 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-1 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-1 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-1 ul.dropdown:before,.example-dropdown-1 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-1 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-1 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-1 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-1 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-1.active{overflow:visible}.example-dropdown-1.active ul.dropdown{display:block}.example-dropdown-2{display:inline-block;position:relative}.example-dropdown-2:before,.example-dropdown-2:after{content:"";display:table}.example-dropdown-2:after{clear:both}.example-dropdown-2 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle:hover:after{color:inherit}.example-dropdown-2 .action.toggle:active:after{color:inherit}.example-dropdown-2 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle.active:hover:after{color:inherit}.example-dropdown-2 .action.toggle.active:active:after{color:inherit}.example-dropdown-2 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-2 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-2 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-2 ul.dropdown:before,.example-dropdown-2 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-2 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-2 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-2 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-2 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-2.active{overflow:visible}.example-dropdown-2.active ul.dropdown{display:block}.example-dropdown-3{display:inline-block;position:relative}.example-dropdown-3:before,.example-dropdown-3:after{content:"";display:table}.example-dropdown-3:after{clear:both}.example-dropdown-3 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle:hover:before{color:red}.example-dropdown-3 .action.toggle:active:before{color:inherit}.example-dropdown-3 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle.active:hover:before{color:red}.example-dropdown-3 .action.toggle.active:active:before{color:inherit}.example-dropdown-3 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-3 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-3 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-3 ul.dropdown:before,.example-dropdown-3 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-3 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-3 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-3 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-3 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-3.active{overflow:visible}.example-dropdown-3.active ul.dropdown{display:block}.example-dropdown-5{display:inline-block;position:relative}.example-dropdown-5:before,.example-dropdown-5:after{content:"";display:table}.example-dropdown-5:after{clear:both}.example-dropdown-5 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle:hover:after{color:inherit}.example-dropdown-5 .action.toggle:active:after{color:inherit}.example-dropdown-5 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle.active:hover:after{color:inherit}.example-dropdown-5 .action.toggle.active:active:after{color:inherit}.example-dropdown-5 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-5 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-5 ul.dropdown li:first-child{border:0}.example-dropdown-5 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-5.active{overflow:visible}.example-dropdown-5.active ul.dropdown{display:block}.example-dropdown-6{display:inline-block;position:relative}.example-dropdown-6:before,.example-dropdown-6:after{content:"";display:table}.example-dropdown-6:after{clear:both}.example-dropdown-6 .action.split{float:left;margin:0}.example-dropdown-6 .action.toggle{float:right;margin:0}.example-dropdown-6 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-6 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-6 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle:hover:after{color:inherit}.example-dropdown-6 .action.toggle:active:after{color:inherit}.example-dropdown-6 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle.active:hover:after{color:inherit}.example-dropdown-6 .action.toggle.active:active:after{color:inherit}.example-dropdown-6 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-6 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-6 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-6 ul.dropdown:before,.example-dropdown-6 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-6 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-6 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-6 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-6 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-6.active{overflow:visible}.example-dropdown-6.active ul.dropdown{display:block}.split.example-dropdown-7{display:inline-block;position:relative}.split.example-dropdown-7:before,.split.example-dropdown-7:after{content:"";display:table}.split.example-dropdown-7:after{clear:both}.split.example-dropdown-7 .action.split{float:left;margin:0}.split.example-dropdown-7 .action.toggle{float:right;margin:0}.split.example-dropdown-7 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle:active:after{color:inherit}.split.example-dropdown-7 .action.toggle.active{display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle.active:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle.active:active:after{color:inherit}.split.example-dropdown-7 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.split.example-dropdown-7 ul.dropdown li{margin:0;padding:3px 5px}.split.example-dropdown-7 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.split.example-dropdown-7 ul.dropdown:before,.split.example-dropdown-7 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.split.example-dropdown-7 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.split.example-dropdown-7 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.split.example-dropdown-7 ul.dropdown:before{top:-12px;right:10px}.split.example-dropdown-7 ul.dropdown:after{top:-14px;right:9px}.split.example-dropdown-7.active{overflow:visible}.split.example-dropdown-7.active ul.dropdown{display:block}.example-dropdown-8{display:inline-block;position:relative}.example-dropdown-8:before,.example-dropdown-8:after{content:"";display:table}.example-dropdown-8:after{clear:both}.example-dropdown-8 .action.split{float:left;margin:0}.example-dropdown-8 .action.toggle{float:right;margin:0}.example-dropdown-8 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-8 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-8 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle:hover:after{color:inherit}.example-dropdown-8 .action.toggle:active:after{color:inherit}.example-dropdown-8 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle.active:hover:after{color:inherit}.example-dropdown-8 .action.toggle.active:active:after{color:inherit}.example-dropdown-8 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-8 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-8 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-8 ul.dropdown:before,.example-dropdown-8 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-8 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-8 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-8 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-8 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-8.active{overflow:visible}.example-dropdown-8.active ul.dropdown{display:block}.example-dropdown-9{display:inline-block;position:relative}.example-dropdown-9 .action.split,.example-dropdown-9 .action.toggle{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-dropdown-9:before,.example-dropdown-9:after{content:"";display:table}.example-dropdown-9:after{clear:both}.example-dropdown-9 .action.split{float:left;margin:0}.example-dropdown-9 .action.toggle{float:right;margin:0}.example-dropdown-9 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-9 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-9 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle:hover:after{color:inherit}.example-dropdown-9 .action.toggle:active:after{color:inherit}.example-dropdown-9 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle.active:hover:after{color:inherit}.example-dropdown-9 .action.toggle.active:active:after{color:inherit}.example-dropdown-9 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-9 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-9 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-9 ul.dropdown:before,.example-dropdown-9 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-9 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-9 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-9 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-9 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-9.active{overflow:visible}.example-dropdown-9.active ul.dropdown{display:block}.example-dropdown-10{display:inline-block;position:relative}.example-dropdown-10 .action.split,.example-dropdown-10 .action.toggle{line-height:1.2rem;padding:5px 8px;font-size:1.1rem}.example-dropdown-10:before,.example-dropdown-10:after{content:"";display:table}.example-dropdown-10:after{clear:both}.example-dropdown-10 .action.split{float:left;margin:0}.example-dropdown-10 .action.toggle{float:right;margin:0}.example-dropdown-10 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-10 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-10 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle:hover:after{color:inherit}.example-dropdown-10 .action.toggle:active:after{color:inherit}.example-dropdown-10 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle.active:hover:after{color:inherit}.example-dropdown-10 .action.toggle.active:active:after{color:inherit}.example-dropdown-10 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-10 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-10 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-10 ul.dropdown:before,.example-dropdown-10 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-10 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-10 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-10 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-10 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-10.active{overflow:visible}.example-dropdown-10.active ul.dropdown{display:block}.example-dropdown-11{display:inline-block;position:relative}.example-dropdown-11:before,.example-dropdown-11:after{content:"";display:table}.example-dropdown-11:after{clear:both}.example-dropdown-11 .action.split{float:right;margin:0}.example-dropdown-11 .action.toggle{float:left;margin:0}.example-dropdown-11 button.action.split{border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-11 button+.action.toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-11 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle:hover:before{color:red}.example-dropdown-11 .action.toggle:active:before{color:inherit}.example-dropdown-11 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle.active:hover:before{color:red}.example-dropdown-11 .action.toggle.active:active:before{color:inherit}.example-dropdown-11 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-11 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-11 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-11 ul.dropdown:before,.example-dropdown-11 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-11 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-11 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-11 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-11 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-11.active{overflow:visible}.example-dropdown-11.active ul.dropdown{display:block}.example-dropdown-12{display:inline-block;position:relative}.example-dropdown-12:before,.example-dropdown-12:after{content:"";display:table}.example-dropdown-12:after{clear:both}.example-dropdown-12 .action.split{float:left;margin:0}.example-dropdown-12 .action.toggle{float:right;margin:0}.example-dropdown-12 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-12 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-12 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle:hover:after{color:inherit}.example-dropdown-12 .action.toggle:active:after{color:inherit}.example-dropdown-12 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle.active:hover:after{color:inherit}.example-dropdown-12 .action.toggle.active:active:after{color:inherit}.example-dropdown-12 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-12 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-12 ul.dropdown li:first-child{border:0}.example-dropdown-12 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-12.active{overflow:visible}.example-dropdown-12.active ul.dropdown{display:block}.example-form-1 .example-form-1-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-1 .example-form-1-fieldset>*{letter-spacing:normal}.example-form-1 .example-form-1-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-1 .example-form-1-fieldset:after{content:attr(data-hasrequired);display:block;font-size:1.2rem;color:#e02b27;margin:10px 0 0;letter-spacing:normal;word-spacing:normal}.example-form-1 .example-form-1-fieldset>.field{margin:0 0 20px}.example-form-1 .example-form-1-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-1 .example-form-1-fieldset>.field:last-child{margin-bottom:0}.example-form-1 .example-form-1-fieldset>.field>.label{font-weight:700}.example-form-1 .example-form-1-fieldset>.field>.label+br{display:none}.example-form-1 .example-form-1-fieldset>.field .choice input{vertical-align:top}.example-form-1 .example-form-1-fieldset>.field .fields.group:before,.example-form-1 .example-form-1-fieldset>.field .fields.group:after{content:"";display:table}.example-form-1 .example-form-1-fieldset>.field .fields.group:after{clear:both}.example-form-1 .example-form-1-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-1 .example-form-1-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-1 .example-form-1-fieldset>.field .addon textarea,.example-form-1 .example-form-1-fieldset>.field .addon select,.example-form-1 .example-form-1-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore,.example-form-1 .example-form-1-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:disabled,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-1 .example-form-1-fieldset>.field .additional{margin-top:10px}.example-form-1 .example-form-1-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-1 .example-form-1-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-1 .example-form-1-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-form-2 .example-form-2-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-2 .example-form-2-fieldset>*{letter-spacing:normal}.example-form-2 .example-form-2-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-2 .example-form-2-fieldset>.field{margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:50%;vertical-align:top}.example-form-2 .example-form-2-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-2 .example-form-2-fieldset>.field:last-child{margin-bottom:0}.example-form-2 .example-form-2-fieldset>.field+.fieldset{clear:both}.example-form-2 .example-form-2-fieldset>.field>.label{font-weight:700}.example-form-2 .example-form-2-fieldset>.field>.label+br{display:none}.example-form-2 .example-form-2-fieldset>.field .choice input{vertical-align:top}.example-form-2 .example-form-2-fieldset>.field .fields.group:before,.example-form-2 .example-form-2-fieldset>.field .fields.group:after{content:"";display:table}.example-form-2 .example-form-2-fieldset>.field .fields.group:after{clear:both}.example-form-2 .example-form-2-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-2 .example-form-2-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-2 .example-form-2-fieldset>.field .addon textarea,.example-form-2 .example-form-2-fieldset>.field .addon select,.example-form-2 .example-form-2-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;box-shadow:none;display:inline-block;margin:0;width:auto}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore,.example-form-2 .example-form-2-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:disabled,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-2 .example-form-2-fieldset>.field .additional{margin-top:10px}.example-form-2 .example-form-2-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-2 .example-form-2-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-2 .example-form-2-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}input[type="text"],input[type="password"],input[type="url"],input[type="tel"],input[type="search"],input[type="number"],input[type="datetime"],input[type="email"]{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}input[type="text"]:disabled,input[type="password"]:disabled,input[type="url"]:disabled,input[type="tel"]:disabled,input[type="search"]:disabled,input[type="number"]:disabled,input[type="datetime"]:disabled,input[type="email"]:disabled{opacity:.5}input[type="text"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="url"]::-moz-placeholder,input[type="tel"]::-moz-placeholder,input[type="search"]::-moz-placeholder,input[type="number"]::-moz-placeholder,input[type="datetime"]::-moz-placeholder,input[type="email"]::-moz-placeholder{color:#c2c2c2}input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder{color:#c2c2c2}input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder{color:#c2c2c2}select{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:5px 10px 4px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}select:disabled{opacity:.5}select[multiple="multiple"]{height:auto;margin-bottom:20px}textarea{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:auto;width:100%;padding:10px;margin:0;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;resize:vertical}textarea:disabled{opacity:.5}textarea::-moz-placeholder{color:#c2c2c2}textarea::-webkit-input-placeholder{color:#c2c2c2}textarea:-ms-input-placeholder{color:#c2c2c2}input[type="checkbox"]{margin:2px 5px 0 0}input[type="checkbox"]:disabled{opacity:.5}input[type="radio"]{margin:2px 5px 0 0}input[type="radio"]:disabled{opacity:.5}input.text-example-1,select.select-example-1,textarea.textarea-example-1{background:#fdf0d5;border-color:#fc0;color:#b30000}input.text-example-1:focus,select.select-example-1:focus,textarea.textarea-example-1:focus{border-color:#cff;color:#060}input.text-example-1:disabled,select.select-example-1:disabled,textarea.textarea-example-1:disabled{color:#fcc}input.text-example-1::-moz-placeholder,textarea.textarea-example-1::-moz-placeholder{color:#ccc}input.text-example-1::-webkit-input-placeholder,textarea.textarea-example-1::-webkit-input-placeholder{color:#ccc}input.text-example-1:-ms-input-placeholder,textarea.textarea-example-1:-ms-input-placeholder{color:#ccc}.number-example{-moz-appearance:textfield}.number-example::-webkit-inner-spin-button,.number-example::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.search-example{-webkit-appearance:none}.search-example::-webkit-search-cancel-button,.search-example::-webkit-search-decoration,.search-example::-webkit-search-results-button,.search-example::-webkit-search-results-decoration{-webkit-appearance:none}input,textarea,select{font-size:1.2rem;color:#e02b27}.example-icon-1{display:inline-block}.example-icon-1:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-2{display:inline-block}.example-icon-2:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -26px 0}.example-icon-3{display:inline-block}.example-icon-3>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-3:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -156px -52px}.example-icon-4{display:inline-block;text-decoration:none}.example-icon-4:before{font-family:'icons-blank-theme';content:'\e606';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-5{display:inline-block;text-decoration:none}.example-icon-5:after{font-family:'icons-blank-theme';content:'\e605';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-6{display:inline-block;text-decoration:none}.example-icon-6>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-6:before{font-family:'icons-blank-theme';content:'\e61b';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-7{display:inline-block}.example-icon-7:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8{display:inline-block}.example-icon-8:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8:before{background-position:-182px 0}.example-icon-9{display:inline-block}.example-icon-9:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-9:after{background-position:-52px -26px}.example-icon-10{display:inline-block}.example-icon-10:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-10:before{background-position:-104px 0}.example-icon-11{display:inline-block}.example-icon-11:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-11:before{width:30px;height:30px}.example-icon-11:after{width:30px;height:30px}.example-icon-11:before{background-color:#f1f1f1}.example-icon-12{display:inline-block;text-decoration:none}.example-icon-12:before{font-family:'icons-blank-theme';content:'\e612';font-size:28px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13{display:inline-block;text-decoration:none}.example-icon-13:before{font-family:'icons-blank-theme';content:'\e612';font-size:inherit;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13:before{font-size:26px;line-height:inherit}.example-icon-14{display:inline-block;text-decoration:none}.example-icon-14:before{font-family:'icons-blank-theme';content:'\e61d';font-size:26px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-14>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.icons-image-list{list-style:none;padding:0}.icons-image-list li{float:left;width:33%}.icons-image-list li>span{display:inline-block}.icons-image-list li>span:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.icons-image-list li .icon-search:before{background-position:0 0}.icons-image-list li .icon-cart:before{background-position:-26px 0}.icons-image-list li .icon-arrow-down:before{background-position:-52px 0}.icons-image-list li .icon-arrow-up:before{background-position:-78px 0}.icons-image-list li .icon-grid:before{background-position:-104px 0}.icons-image-list li .icon-list:before{background-position:-130px 0}.icons-image-list li .icon-remove:before{background-position:-156px 0}.icons-image-list li .icon-star:before{background-position:-182px 0}.icons-image-list li .icon-pointer-down:before{background-position:-208px 0}.icons-image-list li .icon-pointer-up:before{background-position:-234px 0}.icons-image-list li .icon-pointer-left:before{background-position:-260px 0}.icons-image-list li .icon-pointer-right:before{background-position:-286px 0}.icons-image-list li .icon-compare-empty:before{background-position:0 -26px}.icons-image-list li .icon-compare-full:before{background-position:-26px -26px}.icons-image-list li .icon-wishlist-empty:before{background-position:-52px -26px}.icons-image-list li .icon-wishlist-full:before{background-position:-78px -26px}.icons-image-list li .icon-update:before{background-position:-104px -26px}.icons-image-list li .icon-collapse:before{background-position:-130px -26px}.icons-image-list li .icon-expand:before{background-position:-156px -26px}.icons-image-list li .icon-menu:before{background-position:-182px -26px}.icons-image-list li .icon-prev:before{background-position:-208px -26px}.icons-image-list li .icon-next:before{background-position:-234px -26px}.icons-image-list li .icon-settings:before{background-position:-260px -26px}.icons-image-list li .icon-info:before{background-position:-286px -26px}.icons-image-list li .icon-checkmark:before{background-position:0 -52px}.icons-image-list li .icon-calendar:before{background-position:-26px -52px}.icons-image-list li .icon-comment:before{background-position:-52px -52px}.icons-image-list li .icon-comment-reflected:before{background-position:-78px -52px}.icons-image-list li .icon-envelope:before{background-position:-104px -52px}.icons-image-list li .icon-warning:before{background-position:-130px -52px}.icons-image-list li .icon-trash:before{background-position:-156px -52px}.icons-image-list li .icon-flag:before{background-position:-182px -52px}.icons-image-list li .icon-location:before{background-position:-208px -52px}.icons-image-list li .icon-up:before{background-position:-234px -52px}.icons-image-list li .icon-down:before{background-position:-260px -52px}.icons-font-list{list-style:none;padding:0}.icons-font-list li{float:left;width:25%;margin-bottom:35px;text-align:center}.icons-font-list li>span{display:inline-block;text-decoration:none}.icons-font-list li>span:before{font-family:'icons-blank-theme';font-size:34px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.icons-font-list li>span:before{content:attr(data-icon);margin:0 auto;display:block}.loader{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.5);z-index:9999}.loader:before{border-radius:5px;background:transparent url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%;box-sizing:border-box;content:'';position:absolute;top:0;right:0;left:0;bottom:0;margin:auto;width:160px;height:160px}.loading{position:relative}.loading:before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5) url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%}.example-message-info{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-info a{color:#1979c3}.example-message-info a:hover{color:#006bb4}.example-message-info a:active{color:#006bb4}.example-message-warning{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-warning a{color:#1979c3}.example-message-warning a:hover{color:#006bb4}.example-message-warning a:active{color:#006bb4}.example-message-error{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27}.example-message-error a{color:#1979c3}.example-message-error a:hover{color:#006bb4}.example-message-error a:active{color:#006bb4}.example-message-success{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400}.example-message-success a{color:#1979c3}.example-message-success a:hover{color:#006bb4}.example-message-success a:active{color:#006bb4}.example-message-notice{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-notice a{color:#1979c3}.example-message-notice a:hover{color:#006bb4}.example-message-notice a:active{color:#006bb4}.example-message-1{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400;position:relative;padding-left:40px}.example-message-1 a{color:#1979c3}.example-message-1 a:hover{color:#006bb4}.example-message-1 a:active{color:#006bb4}.example-message-1>:first-child:before{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#c07600;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:40px}.example-message-2{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27;position:relative;padding-right:40px}.example-message-2 a{color:#1979c3}.example-message-2 a:hover{color:#006bb4}.example-message-2 a:active{color:#006bb4}.example-message-2:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#b30000}.example-message-2>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-2>:first-child:after{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-2:before{right:0}.example-message-2>:first-child:before{border:5px solid transparent;height:0;width:0;border-right-color:#b30000;right:30px}.example-message-2>:first-child:after{right:0}.example-message-3{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400;position:relative;padding-left:40px}.example-message-3 a{color:#1979c3}.example-message-3 a:hover{color:#006bb4}.example-message-3 a:active{color:#006bb4}.example-message-3:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#006400}.example-message-3>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-3>:first-child:after{font-family:'icons-blank-theme';content:'\e610';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-3:before{left:0}.example-message-3>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#006400;left:30px}.example-message-3>:first-child:after{left:0}.example-message-4{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fc0;border-color:#ffa500;color:#000;position:relative;padding-left:40px;border-width:4px;border-radius:10px}.example-message-4 a{color:#00f}.example-message-4 a:hover{color:#009}.example-message-4 a:active{color:#006}.example-message-4:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#green}.example-message-4>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-4>:first-child:after{font-family:'icons-blank-theme';content:'\e606';font-size:28px;line-height:28px;color:#000;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:15px;left:0;text-align:center;width:30px}.example-message-4:before{left:0}.example-message-4>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#green;left:30px}.example-message-4>:first-child:after{left:0}header.header{background-color:rgba(255,0,0,.2)}.column.main{background-color:rgba(255,255,0,.2)}.column.left{background-color:rgba(0,255,255,.2)}.column.right{background-color:rgba(0,0,255,.2)}footer.footer{background-color:rgba(0,0,0,.2)}.columns{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.columns:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.columns>.column{padding-bottom:40px}@media (min-width: 600px){.page-layout-1column .column.main{ width:100%;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-3columns .column.main{width:66.66666667%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-left .column.main{width:83.33333333%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.main{width:83.33333333%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-left .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-right .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.right{width:16.66666667%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.page-layout-2columns-left .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}}.layout-example-3 .column.main{width:60%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3 .column.left{width:20%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.layout-example-3-1 .column.main{width:60%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3-1 .column.left{width:20%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3-1 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.pages>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.pages .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.pages .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.pages a.page:visited{color:#1979c3}.pages a.page:hover{color:#006bb4;text-decoration:none}.pages a.page:active{color:#ff5501}.pages strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.pages .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.pages .action:visited{color:#7d7d7d}.pages .action:hover{color:#7d7d7d;text-decoration:none}.pages .action:active{color:#7d7d7d}.pages .action.next{display:inline-block;text-decoration:none}.pages .action.next:visited:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.next:hover:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.previous{display:inline-block;text-decoration:none}.pages .action.previous:visited:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.pages .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.previous:hover:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.example-pages-1>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-1>.label:after{content:':'}.example-pages-1 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-1 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 3px;display:inline-block}.example-pages-1 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 a.page{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #b3b3b3;color:#333;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-1 a.page:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#1979c3}.example-pages-1 a.page:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);border:1px solid #999;color:#333;text-decoration:none}.example-pages-1 a.page:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#ff5501}.example-pages-1 strong.page{background:#1979c3;border:1px solid #135d96;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#f7b32e;display:inline-block;font-weight:700;padding:0 4px}.example-pages-1 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-1 .action:visited{color:#7d7d7d}.example-pages-1 .action:hover{color:#ff5501;text-decoration:none}.example-pages-1 .action:active{color:#7d7d7d}.example-pages-1 .action.next{display:inline-block;text-decoration:none}.example-pages-1 .action.next:visited:before{color:#7d7d7d}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.next:hover:before{color:#ff5501}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.previous{display:inline-block;text-decoration:none}.example-pages-1 .action.previous:visited:before{color:#7d7d7d}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-1 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.previous:hover:before{color:#ff5501}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-2>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-2>.label:after{content:':'}.example-pages-2 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-2 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-2 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-2 a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-2 a.page:visited{color:#1979c3}.example-pages-2 a.page:hover{color:#006bb4;text-decoration:none}.example-pages-2 a.page:active{color:#ff5501}.example-pages-2 strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.example-pages-2 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-2 .action:visited{color:#7d7d7d}.example-pages-2 .action:hover{color:#7d7d7d;text-decoration:none}.example-pages-2 .action:active{color:#7d7d7d}.example-pages-3>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-3 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-3 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 a.page{background:#1979c3;color:#fff;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-3 a.page:visited{background:#1979c3;color:#fff}.example-pages-3 a.page:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 a.page:active{background:#ff5501;color:#fff}.example-pages-3 strong.page{background:#1979c3;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#fff;display:inline-block;font-weight:700;padding:0 4px}.example-pages-3 .action{background:#1979c3;border:1px solid #d1d1d1;color:#fff;display:inline-block;padding:0;text-decoration:none}.example-pages-3 .action:visited{background:#1979c3;color:#7d7d7d}.example-pages-3 .action:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 .action:active{background:#ff5501;color:#fff}.example-pages-3 .action.next{display:inline-block;text-decoration:none}.example-pages-3 .action.next:visited:before{color:#7d7d7d}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.next:hover:before{color:#fff}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.previous{display:inline-block;text-decoration:none}.example-pages-3 .action.previous:visited:before{color:#7d7d7d}.example-pages-3 .action.previous:active:before{color:#fff}.example-pages-3 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.previous:hover:before{color:#fff}.example-pages-3 .action.previous:active:before{color:#fff}.window.popup.popup-example{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:focus,.window.popup.popup-example .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example .popup-actions .action.close.disabled,.window.popup.popup-example .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example.active{opacity:1}.window.popup.popup-example-1{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-1 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-1 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-1 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-1 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-1 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-1 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:focus,.window.popup.popup-example-1 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close.disabled,.window.popup.popup-example-1 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-1 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-1.active{opacity:1}.window.overlay{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:1000;opacity:0}.window.overlay.active{opacity:.5;filter:alpha(opacity=50)}.window.popup.popup-example-2{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;overflow-y:auto;max-height:200px;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-2 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-2 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-2 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-2 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-2 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-2 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:focus,.window.popup.popup-example-2 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close.disabled,.window.popup.popup-example-2 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-2 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-2.active{opacity:1}.window.popup.popup-example-3{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-3 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-3 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-3 .popup-content{overflow-y:auto;max-height:200px}.window.popup.popup-example-3 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-3 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-3 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-3 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:focus,.window.popup.popup-example-3 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close.disabled,.window.popup.popup-example-3 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-3 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-3.active{opacity:1}.window.popup.popup-example-4{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-4 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-4 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-4 .popup-content{margin:0 0 20px}.window.popup.popup-example-4 .popup-footer{margin:0 20px}.window.popup.popup-example-4 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-4 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-4 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-4 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:focus,.window.popup.popup-example-4 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close.disabled,.window.popup.popup-example-4 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-4 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-4.active{opacity:1}.window.popup.popup-example-5{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-5 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-5 .popup-header .title{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.window.popup.popup-example-5 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-5 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-5 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-5 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:focus,.window.popup.popup-example-5 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close.disabled,.window.popup.popup-example-5 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-5 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-5.active{opacity:1}.window.popup.popup-example-6{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-6 .popup-footer .actions.toolbar{text-align:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar:before,.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{content:"";display:table}.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{clear:both}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{float:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary a.action,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary .action{margin:0 5px 0 0}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{margin-top:6px}.window.popup.popup-example-6 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-6 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-6 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-6 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-6 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-6 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:focus,.window.popup.popup-example-6 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close.disabled,.window.popup.popup-example-6 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-6 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-6.active{opacity:1}.window.popup.popup-example-7{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-7 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-7 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-7 .popup-actions .action.close{position:absolute;top:10px;right:10px}.window.popup.popup-example-7.active{opacity:1}.window.popup.popup-example-8{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-8 .popup-header{margin:0 0 25px;padding-right:30px}.window.popup.popup-example-8 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-8 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-8 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e613';font-size:30px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0}.window.popup.popup-example-8 .popup-actions .action.close:hover:before{color:#090}.window.popup.popup-example-8 .popup-actions .action.close:active:before{color:#00f}.window.popup.popup-example-8 .popup-actions .action.close:focus,.window.popup.popup-example-8 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close.disabled,.window.popup.popup-example-8 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-8 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-8.active{opacity:1}.window.popup.popup-example-9{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-9 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-9 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-9 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-9 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-9 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-9 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:focus,.window.popup.popup-example-9 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close.disabled,.window.popup.popup-example-9 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-9 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-9.active{opacity:1}.window.overlay.example-overlay-1.active{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#0f5293;z-index:1000;opacity:0}.window.overlay.example-overlay-1.active.active{opacity:.8;filter:alpha(opacity=80)}.example-ratings-1{overflow:hidden}.example-ratings-1:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-1 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 input[type="radio"]:focus+label:before,.example-ratings-1 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-1 label{position:absolute;display:block;cursor:pointer}.example-ratings-1 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-1 label:hover:before{opacity:1}.example-ratings-1 label:hover~label:before{opacity:0}.example-ratings-1 .rating-5{z-index:2}.example-ratings-1 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-4{z-index:3}.example-ratings-1 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-3{z-index:4}.example-ratings-1 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-1 .rating-2{z-index:5}.example-ratings-1 .rating-2:before{content:'\e605' '\e605'}.example-ratings-1 .rating-1{z-index:6}.example-ratings-1 .rating-1:before{content:'\e605'}.example-ratings-2{overflow:hidden}.example-ratings-2:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-2 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 input[type="radio"]:focus+label:before,.example-ratings-2 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-2 label{position:absolute;display:block;cursor:pointer}.example-ratings-2 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-2 label:hover:before{opacity:1}.example-ratings-2 label:hover~label:before{opacity:0}.example-ratings-2 .rating-8{z-index:2}.example-ratings-2 .rating-8:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-7{z-index:3}.example-ratings-2 .rating-7:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-6{z-index:4}.example-ratings-2 .rating-6:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-5{z-index:5}.example-ratings-2 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-4{z-index:6}.example-ratings-2 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-3{z-index:7}.example-ratings-2 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-2 .rating-2{z-index:8}.example-ratings-2 .rating-2:before{content:'\e605' '\e605'}.example-ratings-2 .rating-1{z-index:9}.example-ratings-2 .rating-1:before{content:'\e605'}.example-ratings-3{overflow:hidden}.example-ratings-3:before{color:#aff5e3;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-3 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 input[type="radio"]:focus+label:before,.example-ratings-3 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-3 label{position:absolute;display:block;cursor:pointer}.example-ratings-3 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 label:before{color:#0a6767;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-3 label:hover:before{opacity:1}.example-ratings-3 label:hover~label:before{opacity:0}.example-ratings-3 .rating-5{z-index:2}.example-ratings-3 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-4{z-index:3}.example-ratings-3 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-3{z-index:4}.example-ratings-3 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-3 .rating-2{z-index:5}.example-ratings-3 .rating-2:before{content:'\e605' '\e605'}.example-ratings-3 .rating-1{z-index:6}.example-ratings-3 .rating-1:before{content:'\e605'}.example-ratings-4{overflow:hidden}.example-ratings-4:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e600' '\e600' '\e600' '\e600' '\e600';position:absolute;z-index:1;display:block}.example-ratings-4 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 input[type="radio"]:focus+label:before,.example-ratings-4 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-4 label{position:absolute;display:block;cursor:pointer}.example-ratings-4 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-4 label:hover:before{opacity:1}.example-ratings-4 label:hover~label:before{opacity:0}.example-ratings-4 .rating-5{z-index:2}.example-ratings-4 .rating-5:before{content:'\e600' '\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-4{z-index:3}.example-ratings-4 .rating-4:before{content:'\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-3{z-index:4}.example-ratings-4 .rating-3:before{content:'\e600' '\e600' '\e600'}.example-ratings-4 .rating-2{z-index:5}.example-ratings-4 .rating-2:before{content:'\e600' '\e600'}.example-ratings-4 .rating-1{z-index:6}.example-ratings-4 .rating-1:before{content:'\e600'}.exapmle-ratings-5 .control.rating.vote{overflow:hidden}.exapmle-ratings-5 .control.rating.vote:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.exapmle-ratings-5 .control.rating.vote input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote input[type="radio"]:focus+label:before,.exapmle-ratings-5 .control.rating.vote input[type="radio"]:checked+label:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label{position:absolute;display:block;cursor:pointer}.exapmle-ratings-5 .control.rating.vote label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.exapmle-ratings-5 .control.rating.vote label:hover:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label:hover~label:before{opacity:0}.exapmle-ratings-5 .control.rating.vote .rating-5{z-index:2}.exapmle-ratings-5 .control.rating.vote .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-4{z-index:3}.exapmle-ratings-5 .control.rating.vote .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-3{z-index:4}.exapmle-ratings-5 .control.rating.vote .rating-3:before{content:'\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-2{z-index:5}.exapmle-ratings-5 .control.rating.vote .rating-2:before{content:'\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-1{z-index:6}.exapmle-ratings-5 .control.rating.vote .rating-1:before{content:'\e605'}.example-rating-summary-1{white-space:nowrap;overflow:hidden}.example-rating-summary-1 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-1 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-1 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-2{white-space:nowrap;overflow:hidden}.example-rating-summary-2 .rating-result{width:154px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-2 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-2 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-3{white-space:nowrap;overflow:hidden}.example-rating-summary-3 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-3 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#aff5e3;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-3 .rating-result>span:before{position:relative;z-index:2;color:#0a6767;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-4{white-space:nowrap;overflow:hidden}.example-rating-summary-4 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-4 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-4 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5{white-space:nowrap;overflow:hidden}.example-rating-summary-5 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-5 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-5 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-6 .rating-summary{white-space:nowrap;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-6 .rating-summary .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span{display:block;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7{white-space:nowrap;overflow:hidden}.example-rating-summary-7 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-7 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-7 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-responsive-block{padding:10px}.example-sections-1{position:relative;z-index:1}.example-sections-1:before,.example-sections-1:after{content:"";display:table}.example-sections-1:after{clear:both}.example-sections-1>.item.title{float:left;width:auto}.example-sections-1>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-1>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-1>.item.content:before,.example-sections-1>.item.content:after{content:"";display:table}.example-sections-1>.item.content:after{clear:both}.example-sections-1>.item.content.active{display:block}.example-sections-1>.item.title{margin:0 5px 0 0}.example-sections-1>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-1>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-1>.item.title:not(.disabled)>.switch:focus,.example-sections-1>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-1>.item.title:not(.disabled)>.switch:active,.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-1>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}.example-sections-2{position:relative;z-index:1}.example-sections-2:before,.example-sections-2:after{content:"";display:table}.example-sections-2:after{clear:both}.example-sections-2>.item.title{float:left;width:auto}.example-sections-2>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-2>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-2>.item.content:before,.example-sections-2>.item.content:after{content:"";display:table}.example-sections-2>.item.content:after{clear:both}.example-sections-2>.item.content.active{display:block}.example-sections-2>.item.title{margin:0 5px 0 0}.example-sections-2>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-2>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-2>.item.title:not(.disabled)>.switch:focus,.example-sections-2>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-2>.item.title:not(.disabled)>.switch:active,.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-2>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:0;border-top:1px solid #d1d1d1}.example-sections-3{margin:0;padding:0}.example-sections-3>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-3>.item.title>.switch{display:block}.example-sections-3>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-3>.item.content:before,.example-sections-3>.item.content:after{content:"";display:table}.example-sections-3>.item.content:after{clear:both}.example-sections-3>.item.content.active{display:block}.example-sections-3>.item.title{margin:0 0 5px}.example-sections-3>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-3>.item.title:not(.disabled)>.switch:focus,.example-sections-3>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-3>.item.title:not(.disabled)>.switch:active,.example-sections-3>.item.title.active>.switch,.example-sections-3>.item.title.active>.switch:focus,.example-sections-3>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-3>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}@media only screen and (max-width: 99999px){.example-sections-4{ position:relative;z-index:1}.example-sections-4:before,.example-sections-4:after{content:"";display:table}.example-sections-4:after{clear:both}.example-sections-4>.item.title{float:left;width:auto}.example-sections-4>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-4>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 5px 0 0}.example-sections-4>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-4>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}}@media only screen and (max-width: 768px){.example-sections-4{ margin:0;padding:0}.example-sections-4>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-4>.item.title>.switch{display:block}.example-sections-4>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 0 5px}.example-sections-4>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-4>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}}.example-sections-5{position:relative;z-index:1}.example-sections-5:before,.example-sections-5:after{content:"";display:table}.example-sections-5:after{clear:both}.example-sections-5>.item.title{float:left;width:auto}.example-sections-5>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-5>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-5>.item.content:before,.example-sections-5>.item.content:after{content:"";display:table}.example-sections-5>.item.content:after{clear:both}.example-sections-5>.item.content.active{display:block}.example-sections-6{margin:0;padding:0}.example-sections-6>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-6>.item.title>.switch{display:block}.example-sections-6>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-6>.item.content:before,.example-sections-6>.item.content:after{content:"";display:table}.example-sections-6>.item.content:after{clear:both}.example-sections-6>.item.content.active{display:block}.example-table-1{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-1 th{text-align:left}.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{vertical-align:top}.example-table-1>thead>tr>th,.example-table-1>thead>tr>td{vertical-align:bottom}.example-table-1>thead>tr>th,.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>thead>tr>td,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{padding:8px 10px}.example-table-2>thead>tr>th,.example-table-2>tbody>tr>th,.example-table-2>tfoot>tr>th{color:#111;font-weight:700}.example-table-3{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-3 th{text-align:left}.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{vertical-align:top}.example-table-3>thead>tr>th,.example-table-3>thead>tr>td{vertical-align:bottom}.example-table-3>thead>tr>th,.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>thead>tr>td,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{padding:8px 10px}.example-table-3>caption{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-table-4{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-4 th{text-align:left}.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{vertical-align:top}.example-table-4>thead>tr>th,.example-table-4>thead>tr>td{vertical-align:bottom}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:8px 10px}.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:15px 25px 5px 0}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th{padding:15px 25px 10px 0}.example-table-5{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;background:#fff}.example-table-5 th{text-align:left}.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{vertical-align:top}.example-table-5>thead>tr>th,.example-table-5>thead>tr>td{vertical-align:bottom}.example-table-5>thead>tr>th,.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>thead>tr>td,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{padding:8px 10px}.example-table-5>thead{background:#ccf}.example-table-5>tfoot{background:#cff}.example-table-5>tbody>tr>td{background:#fcc}.example-table-5>tbody>tr>th{background:#ffc}.example-table-6{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-6 th{text-align:left}.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{vertical-align:top}.example-table-6>thead>tr>th,.example-table-6>thead>tr>td{vertical-align:bottom}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{padding:8px 10px}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-7{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-7 th{text-align:left}.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{vertical-align:top}.example-table-7>thead>tr>th,.example-table-7>thead>tr>td{vertical-align:bottom}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{padding:8px 10px}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{border-top:1px solid #d1d1d1}.example-table-7>caption+thead>tr:first-child>th,.example-table-7>colgroup+thead>tr:first-child>th,.example-table-7>thead:first-child>tr:first-child>th,.example-table-7>caption+thead>tr:first-child>td,.example-table-7>colgroup+thead>tr:first-child>td,.example-table-7>thead:first-child>tr:first-child>td{border-top:0}.example-table-7>tbody+tbody{border-top:1px solid #d1d1d1}.example-table-8{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-8 th{text-align:left}.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{vertical-align:top}.example-table-8>thead>tr>th,.example-table-8>thead>tr>td{vertical-align:bottom}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{padding:8px 10px}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{border-left:1px solid #d1d1d1}.example-table-8>thead>tr>th:first-child,.example-table-8>tbody>tr>th:first-child,.example-table-8>tfoot>tr>th:first-child,.example-table-8>thead>tr>td:first-child,.example-table-8>tbody>tr>td:first-child,.example-table-8>tfoot>tr>td:first-child{border-left:0}.example-table-9{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-9 th{text-align:left}.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{vertical-align:top}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{vertical-align:bottom}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{padding:8px 10px}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{border:0}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{border-bottom:1px solid #d1d1d1}.example-table-10{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-10 th{text-align:left}.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{vertical-align:top}.example-table-10>thead>tr>th,.example-table-10>thead>tr>td{vertical-align:bottom}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{padding:8px 10px}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{border:0}.example-table-11{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-11 th{text-align:left}.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{vertical-align:top}.example-table-11>thead>tr>th,.example-table-11>thead>tr>td{vertical-align:bottom}.example-table-11>thead>tr>th,.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>thead>tr>td,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{padding:8px 10px}.example-table-11>tbody>tr:nth-child(even)>td,.example-table-11>tbody>tr:nth-child(even)>th{background:#ffc;color:#000}.example-table-12{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-12 th{text-align:left}.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{vertical-align:top}.example-table-12>thead>tr>th,.example-table-12>thead>tr>td{vertical-align:bottom}.example-table-12>thead>tr>th,.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>thead>tr>td,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{padding:8px 10px}.example-table-12>tbody>tr:nth-child(even):hover>td,.example-table-12>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-12>tbody>tr:nth-child(odd):hover>td,.example-table-12>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}.example-table-13{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-13 th{text-align:left}.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{vertical-align:top}.example-table-13>thead>tr>th,.example-table-13>thead>tr>td{vertical-align:bottom}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{padding:8px 10px}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-13>tbody>tr:nth-child(odd)>td,.example-table-13>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-13>tbody>tr:nth-child(even):hover>td,.example-table-13>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-13>tbody>tr:nth-child(odd):hover>td,.example-table-13>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-14{ width:100%;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}}.example-table-15{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-15 th{text-align:left}.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{vertical-align:top}.example-table-15>thead>tr>th,.example-table-15>thead>tr>td{vertical-align:bottom}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{padding:8px 10px}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-15{ border:0;display:block;background:#cff}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#cff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#cff}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#cff}.example-table-15>thead>tr>th{display:none}.example-table-15>tbody{display:block}.example-table-15>tbody>tr{display:block}.example-table-15>tbody>tr td,.example-table-15>tbody>tr th{border-bottom:0;display:block;padding:5px 0}.example-table-15>tbody>tr td:before,.example-table-15>tbody>tr th:before{content:attr(data-th) ":";display:inline-block;padding-right:10px;color:#111;font-weight:700}.example-table-15>tbody>tr td{background:#cff}.example-table-15>tbody>tr>th{background-color:#ffc!important}}.example-tooltip-bottom{position:relative}.example-tooltip-bottom .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;top:100%;left:0;margin-top:5px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-bottom .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-bottom .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{bottom:100%}.example-tooltip-bottom .tooltip-content:after{border-bottom-color:#fff;margin-left:-5px;left:15px}.example-tooltip-bottom .tooltip-content:before{border-bottom-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-bottom .tooltip-toggle{cursor:help}.example-tooltip-bottom .tooltip-toggle:hover+.tooltip-content,.example-tooltip-bottom .tooltip-toggle:focus+.tooltip-content,.example-tooltip-bottom:hover .tooltip-content{display:block}.example-tooltip-left{position:relative}.example-tooltip-left .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;right:100%;top:0;margin-right:5px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-left .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-left .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{left:100%}.example-tooltip-left .tooltip-content:after{border-left-color:#fff;margin-top:-5px;top:15px}.example-tooltip-left .tooltip-content:before{border-left-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-left .tooltip-toggle{cursor:help}.example-tooltip-left .tooltip-toggle:hover+.tooltip-content,.example-tooltip-left .tooltip-toggle:focus+.tooltip-content,.example-tooltip-left:hover .tooltip-content{display:block}.example-tooltip-right{position:relative}.example-tooltip-right .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;left:100%;top:0;margin-left:5px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-right .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-right .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{right:100%}.example-tooltip-right .tooltip-content:after{border-right-color:#fff;margin-top:-5px;top:15px}.example-tooltip-right .tooltip-content:before{border-right-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-right .tooltip-toggle{cursor:help}.example-tooltip-right .tooltip-toggle:hover+.tooltip-content,.example-tooltip-right .tooltip-toggle:focus+.tooltip-content,.example-tooltip-right:hover .tooltip-content{display:block}.example-tooltip-top{position:relative}.example-tooltip-top .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;bottom:100%;left:0;margin-bottom:5px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-top .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-top .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{top:100%}.example-tooltip-top .tooltip-content:after{border-top-color:#fff;margin-left:-5px;left:15px}.example-tooltip-top .tooltip-content:before{border-top-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-top .tooltip-toggle{cursor:help}.example-tooltip-top .tooltip-toggle:hover+.tooltip-content,.example-tooltip-top .tooltip-toggle:focus+.tooltip-content,.example-tooltip-top:hover .tooltip-content{display:block}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-line-height{line-height:3rem}.example-word-wrap{word-break:break-all;word-break:break-word;word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;background:#ccc;width:120px}.example-text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#ccc;width:120px}.example-text-hide{background-color:transparent;border:0;font:0/0 a;color:transparent;text-shadow:none}.example-hyphens{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.example-hyphens-none{word-wrap:break-word;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.example-typography{color:#fc0;font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-weight:500;font-style:italic;line-height:1.2}.example-list-reset-styles{margin:0;padding:0;list-style:none none}.example-list-inline{margin:0;padding:0;list-style:none none}.example-list-inline>li{display:inline-block;vertical-align:top}.example-link-default{color:#1979c3;text-decoration:none}.example-link-default:visited{color:#1979c3;text-decoration:none}.example-link-default:hover{color:#006bb4;text-decoration:underline}.example-link-default:active{color:#ff5501;text-decoration:underline}.example-link{color:#008000;text-decoration:none}.example-link:visited{color:#1979c3;text-decoration:none}.example-link:hover{color:#ffa500;text-decoration:none}.example-link:active{color:#ff5501;text-decoration:underline}.example-heading{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.example-heading-2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{font-size:71.42857143%;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-break:break-all;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-clearfix-container-1{border:1px solid red}.example-clearfix-container-2{border:1px solid #0f0}.example-clearfix-container-2:before,.example-clearfix-container-2:after{content:"";display:table}.example-clearfix-container-2:after{clear:both}.example-clearfix-item.left{float:left}.example-clearfix-item.right{float:right}.example-visibility-hidden{height:0;visibility:hidden}.example-visually-hidden-1{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{background:#fdf0d5;padding:5px;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.example-css-container{padding:20px;background:#e8e8e8}.example-rotate{background:red;position:absolute;height:20px;width:40px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.example-placeholder::-webkit-input-placeholder{color:#808080;font-weight:700}.example-placeholder:-moz-placeholder{color:#808080;font-weight:700}.example-placeholder::-moz-placeholder{color:#808080;font-weight:700}.example-placeholder:-ms-input-placeholder{color:#808080;font-weight:700}.example-background-gradient-1{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #cff 0, #ccf 100%);background-image:linear-gradient(to bottom, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=0)}.example-background-gradient-2{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop( #cff 0),color-stop( #ccf 100%));background-image:linear-gradient(to right, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=1)}.example-background-gradient-3-wrapper{background:#ffc;padding:10px}.example-background-gradient-3{background-color:rgba(255,255,255,0);background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(rgba(255,255,255,0) 0),color-stop( #ccf 100%));background-image:linear-gradient(to right,rgba(255,255,255,0) 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(255, 255, 255, 0)',endColorstr='#ccccff',GradientType=1)}body{padding:15px;background-image:none}</style></head><body><nav class="bar top cf"><div class="container"><a href="index.html" class="brand">Magento UI Library</a><ul class="menu"><li><a href="#" data-toggle="dropdown-1" unselectable="on" class="dropdown-toggle">files</a><ul id="dropdown-1" hidden class="dropdown"><li><a href="actions-toolbar.html">actions-toolbar</a></li><li><a href="breadcrumbs.html">breadcrumbs</a></li><li><a href="buttons.html">buttons</a></li><li><a href="docs.html">docs</a></li><li><a href="dropdowns.html">dropdowns</a></li><li><a href="forms.html">forms</a></li><li><a href="icons.html">icons</a></li><li><a href="layout.html">layout</a></li><li><a href="lib.html">lib</a></li><li><a href="loaders.html">loaders</a></li><li><a href="messages.html">messages</a></li><li><a href="pages.html">pages</a></li><li><a href="popups.html">popups</a></li><li><a href="rating.html">rating</a></li><li><a href="resets.html">resets</a></li><li><a href="responsive.html">responsive</a></li><li><a href="sections.html">sections</a></li><li><a href="tables.html">tables</a></li><li><a href="tooltips.html">tooltips</a></li><li><a href="typography.html">typography</a></li><li><a href="utilities.html">utilities</a></li><li><a href="variables.html">variables</a></li></ul></li></ul><div class="nav"><button title="Table of Contents" data-toggle="nav-toc"><svg viewBox="0 0 512 512" height="22" width="22" class="icon"><path d="M108.9,403.1V462H50v-58.9H108.9z M108.9,285.4H50v58.9h58.9V285.4zM108.9,50H50v58.9h58.9V50z M108.9,167.7H50v58.9h58.9V167.7z M167.7,344.3H462v-58.9H167.7V344.3zM167.7,50v58.9H462V50H167.7z M167.7,462H462v-58.9H167.7V462z M167.7,226.6H462v-58.9H167.7V226.6z"></path></svg></button><input type="search" placeholder="Search" class="search"></div></div></nav><section class="container"><article id="icons" class="section"><div class="docs"><a href="#icons" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icons">Icons</h1> +</title><meta charset="utf-8"><style>*{-moz-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;border:0}body{padding:60px 0 40px;background-color:hsl(207,10%,90%);color:hsl(207,5%,30%)}.container{max-width:1300px;margin:0 auto;padding:0 20px}.section{position:relative;margin-bottom:20px}.docs{position:relative;z-index:2;width:68%;min-height:200px;background-color:hsl(207,0%,100%);background-clip:padding-box;border:1px solid hsla(207,5%,5%,.1);border-radius:5px;box-shadow:0 0 3px hsla(207,5%,5%,.1)}.code{position:absolute;top:5px;bottom:5px;right:0;z-index:1;width:33%;padding:10px 10px 10px 20px;border-radius:0 5px 5px 0;border:1px solid hsla(207,20%,10%,.1);background-color:hsla(207,20%,95%,.9);background-clip:padding-box;opacity:.5;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.code:hover{opacity:1}.preview{background:hsl(207,0%,100%);border-top:1px solid hsl(207,30%,95%);position:relative;z-index:1}.preview-code+.preview{margin-top:0;border-top:0}.preview iframe{display:block;width:100%;height:100%;overflow:hidden}.preview-code{position:relative;z-index:2;display:block;width:100%;color:hsl(207,9%,37%);max-height:200px;padding:10px 20px;overflow-y:auto;background:hsl(207,30%,95%);border:1px solid hsl(207,30%,85%);border-left:0;border-right;box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1);line-height:1.1!important;resize:none}.preview-code:focus{outline:0;background:hsl(207,30%,97%);box-shadow:inset 0 1px 2px hsla(207,30%,10%,.1),0 0 5px hsla(207,75%,75%,.9)}.preview-code:last-child{border-bottom:0;border-radius:0 0 5px 5px}.resizeable{padding:15px;overflow:auto;background:hsl(207,0%,100%);box-shadow:0 0 2px hsla(207,10%,20%,.2);resize:both}.preview-code,pre{white-space:pre-wrap;word-wrap:break-word;overflow-y:auto}.code pre{height:100%;margin-top:0}.bar{position:fixed;left:0;right:0;z-index:1010;min-height:40px;line-height:40px;background-image:-webkit-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-moz-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:-o-linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92));background-image:linear-gradient(hsla(207,10%,35%,.97),hsla(207,5%,25%,.92))}.bar.top{top:0;box-shadow:0 1px 2px hsla(207,5%,0%,.2)}.bar.bottom{bottom:0;box-shadow:0 -1px 2px hsla(207,5%,0%,.2)}.bar ul{margin:0!important}.bar li{display:block;list-style:none}.bar .icon path{fill:hsla(27,10%,75%,.75)}.docs .icon path{fill:hsla(207,10%,75%,.5)}.docs .permalink:hover .icon path{fill:hsl(207,10%,75%)}.bar button{color:hsla(27,10%,75%,.75)}.bar button:hover .icon path,.bar button.is-active .icon path{fill:hsl(27,10%,85%)}.bar button:hover,.bar button.is-active{color:hsl(27,10%,85%)}.bar .icon{vertical-align:middle;display:inline-block}.bar,.bar a,.bar a:visited{color:hsl(27,10%,85%);text-shadow:1px 1px 0 hsla(27,5%,0%,.5)}.bar a:hover,.bar a.is-active{color:hsl(27,10%,95%);text-shadow:1px 1px 0 hsla(27,5%,0%,1);text-decoration:none}.brand{float:left;margin-right:20px;font-weight:700;font-size:16px;text-decoration:none}.brand,a.brand,a.brand:visited{color:hsl(27,5%,5%);text-shadow:1px 1px 0 hsla(27,5%,100%,.2)}.brand:hover,a.brand:hover{color:hsl(27,5%,0%);text-shadow:1px 1px 0 hsla(27,5%,100%,.3);text-decoration:none}.menu{font-size:12px}.menu>li{float:left;position:relative}.menu a{display:block;margin-right:15px}.dropdown-toggle{position:relative;padding-right:15px}.dropdown-toggle:after{display:block;position:absolute;right:0;top:18px;content:'';border:4px solid;border-left-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.nav-results,.dropdown{position:absolute;z-index:1020;top:32px;left:-16px;width:175px;max-height:500px;padding:10px 0;overflow-y:auto;word-wrap:break-word;font-size:11px;line-height:20px;background-color:hsla(207,10%,25%,.97);border:1px solid hsla(207,5%,70%,.3);border-radius:3px;box-shadow:0 0 3px hsla(207,5%,0%,.2)}.toc-list{width:200px}.nav-results{right:0;width:200px;left:auto;padding:5px 0}.nav-results-filename{display:block;font-size:10px;opacity:.75}.nav-results a{display:block;line-height:15px;padding:5px 10px}.nav-results li:not([hidden])~li a{border-top:1px solid hsla(27,10%,90%,.1)}.dropdown a{padding:0 15px}.dropdown li:hover{background-color:hsl(207,10%,22%)}.nav{float:right;position:relative}.nav input[type="search"]{padding:2px 4px;color:#fff;width:150px;border:1px solid hsla(207,5%,0%,.3);background:hsla(207,12%,40%,.9);box-shadow:inset 1px 1px 3px hsla(207,5%,0%,.05),1px 1px 0 hsla(207,5%,100%,.05);border-radius:10px;-webkit-appearance:textfield}.nav input[type="search"]:focus{outline:0;background:hsla(207,7%,45%,.9)}.settings{text-align:center}.bar button{display:inline-block;vertical-align:middle;padding:0 5px;margin:0 3px;background:transparent}.bar button:first-child{margin-left:0}.settings .auto{line-height:32px;font-size:11px;font-weight:700;letter-spacing:-1px;text-shadow:none;text-transform:uppercase}body{font-family:sans-serif;font-size:14px;line-height:1.618}.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-left:20px;margin-right:20px}.preview,.docs pre,p,ol,ul,dl,figure,blockquote,table{margin-top:10px}ul ul,ol ol,ul ol,ol ul,blockquote p:last-child{margin-top:0}ul,ol{padding-left:1.5em}p:last-child,ol:last-child,ul:last-child,dl:last-child{margin-bottom:20px}hr,h1,h2,h3,h4,h5,h6{margin:1em 20px .5em}h1:first-of-type{margin-top:20px}h1,h2,h3,h4,h5,h6{line-height:1.2;color:hsl(207,10%,50%)}h1 a,h1 a:hover,h1 a:visited{color:inherit;text-decoration:inherit}h1{font-size:3.052em;font-weight:400;color:hsl(207,10%,45%)}h2{font-size:1.953em}h3{font-size:1.536em}h1,h2,h3{letter-spacing:-.025em}h4{font-size:1.25em}h5{font-size:1em;text-transform:uppercase}h6{font-size:1em}.permalink{position:absolute;top:15px;right:15px}a{color:hsl(207,90%,50%);text-decoration:none}a:hover{color:hsl(207,95%,40%);text-decoration:underline}a:visited{color:hsl(207,100%,35%)}.preview-code,pre,code,var{font-style:normal;font-family:"Ubuntu Mono","Andale Mono","DejaVu Sans Mono","Monaco","Bitstream Vera Sans Mono","Consolas","Lucida Console",monospace;font-size:12px}.docs pre,code,var{padding:.1em 3px;background:hsla(207,5%,0%,.025);border:1px solid hsla(207,5%,0%,.05);border-radius:3px}.code pre{line-height:1.1!important}pre code{padding:0;background:transparent;border:0}.cf:before,.cf:after{content:'';display:table}.cf:after{clear:both}[unselectable="on"]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[hidden]{display:none!important}small{font-size:85%;opacity:.9}.docs .vars_list{width:100%}.docs .vars_list th,.docs .vars_list td{width:33%}.docs pre th{text-align:left}.docs pre table{border-collapse:collapse;margin:0}.docs th,.docs td{border:0;padding:9px 10px 9px 0;vertical-align:top}.docs tr th:last-child,.docs tr td:last-child{padding-right:0}.docs pre th{font-weight:400}.docs pre th.vars_head{border-bottom:1px solid #e5e5e5;color:#707070;white-space:nowrap}.docs pre th.vars_section{border-bottom:1px solid #e5e5e5;color:#333;font-size:18px;padding-top:30px}.vars_value{color:#338bb8}.docs li p{margin:0 0 20px}.dropdown a{text-transform:capitalize}#default-button #default-button-big+.preview+.preview-code{display:block}#actions-toolbar-alignment .preview-code,#reverse-primary-and-secondary-blocks .preview-code,#actions-toolbar-indents-customizations .preview-code,#actionstoolbarclearfloats-mixin .preview-code,#responsive-actions-toolbar .preview-code,#button-with-gradient-background .preview-code,#primary-button .preview-code,#button-as-an-icon .preview-code,#button-with-an-icon-on-the-left-or-right-side-of-the-text .preview-code,#button-with-fixed-width .preview-code,#button-as-a-link .preview-code,#link-as-a-button .preview-code,#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol .preview-code,#breadcrumbs-with-solid-background .preview-code,#pagination-without-label-with-solid-background .preview-code,#pagination-with-label-and-text-previousnext-links .preview-code,#pagination-with-label-and-gradient-background-on-links .preview-code,#fixed-height-popup .preview-code,#fixed-content-height-popup .preview-code,#margins-for-header-content-and-footer-block-in-popup .preview-code,#popup-titles-with-styled-as-theme-headings .preview-code,#popup-action-toolbar .preview-code,#popup-close-button-without-an-icon .preview-code,#modify-icon-of-popup-close-button .preview-code,#modify-overlay-styles .preview-code,#rating-summary-multiple-ratings .preview-code,#rating-summary-hide-label .preview-code,#rating-summary-icons-symbol .preview-code,#rating-summary-icons-color .preview-code,#rating-summary-set-number-of-icons .preview-code,#rating-summary .preview-code,#rating-with-vote-icon-symbol .preview-code,#rating-with-vote-setup-icons-colors .preview-code,#rating-with-vote-setup-number-of-icons .preview-code,#tabs-with-content-top-border .preview-code,#accordion-mixin-variables .preview-code,#tabs-base .preview-code,#accordion-base .preview-code,#warning-message .preview-code,#error-message .preview-code,#success-message .preview-code,#notice-message .preview-code,#message-with-inner-icon .preview-code,#message-with-lateral-icon .preview-code,#custom-message-style .preview-code,#modify-dropdown-list-styles .preview-code,#dropdown-with-icon-customization .preview-code,#split-button-button-styling .preview-code,#split-button-icon-customization .preview-code,#split-button-dropdown-list-customization .preview-code,#table-cells-resize .preview-code,#table-caption .preview-code,#table-typography .preview-code,#table-background-customization .preview-code,#table-borders-customization .preview-code,#table-without-borders .preview-code,#table-with-horizontal-borders .preview-code,#table-with-vertical-borders .preview-code,#striped-table .preview-code,#responsive-table-technics-1 .preview-code,#responsive-table-technics-2 .preview-code,#fontsize-mixin .preview-code,#word-breaking-mixin .preview-code,#word-breaking-mixin .preview-code,#text-overflow-mixin .preview-code,#text-hide .preview-code,#hyphens .preview-code,#font-style-and-color .preview-code,#reset-list-styles .preview-code,#inlineblock-list-item-styling .preview-code,#link-styling-mixin .preview-code,#heading-styling-mixin .preview-code,#icon-with-image-or-sprite .preview-code,#change-the-size-of-font-icon .preview-code,#sprite-and-font-icons-for-blank-theme .preview-code,#icon-position-for-an-icon-with-image-or-sprite .preview-code{display:none}article[id$="-variables"] .docs,#resets .docs,#ratings .docs,#tabs-and-accordions .docs,#messages .docs,#dropdown-and-split-buttons-mixins .docs,#font-face-mixin .docs,#layout .docs,#forms-mixins .docs,#including-magento-ui-library-to-your-theme .docs,#global-forms-elements-customization .docs,#mobile-off-canvas-navigation .docs,#desktop-navigation .docs,#utilities .docs,#layout-width .docs,#responsive-breakpoints .docs,#responsive-mixins-usage .docs{width:100%}article[id$="-variables"] .code{display:none}article[id$="-variables"] .docs pre{background:#fff;border:0;margin-top:0}</style><script type="text/preview">(function(){"use strict";var a=function(a){return Array.prototype.slice.call(a)},b=document.getElementsByTagName("body")[0],c=["link","visited","hover","active","focus","target","enabled","disabled","checked"],d=new RegExp(":(("+c.join(")|(")+"))","gi"),e=a(document.styleSheets).map(function(b){return a(b.cssRules).filter(function(a){return a.selectorText&&a.selectorText.match(d)}).map(function(a){return a.cssText.replace(d,".\\3A $1")}).join("")}).join("");if(e.length){var f=document.createElement("style");f.innerText=e;var g=document.getElementsByTagName("style")[0];g.parentNode.insertBefore(f,g)}var h=function(){var a=window.getComputedStyle(b,null);return function(){if(b.childElementCount===0)return b.offsetHeight;var c=b.getElementsByTagName("*"),d=[];for(var e=0,f=c.length;e<f;e++)d.push(c[e].offsetTop+c[e].offsetHeight+parseInt(window.getComputedStyle(c[e],null).getPropertyValue("margin-bottom")));var g=Math.max.apply(Math,d);return g+=parseInt(a.getPropertyValue("padding-bottom"),10),Math.max(g,b.offsetHeight)}}(),i={getHeight:function(){window.parent.postMessage({height:h()},"*")}};window.addEventListener("message",function(a){if(a.data==null)return;typeof a.data=="string"&&i[a.data]()},!1)})()</script><style type="text/preview">.actions-toolbar:before,.actions-toolbar:after{content:"";display:table}.actions-toolbar:after{clear:both}.actions-toolbar .primary{float:left}.actions-toolbar .secondary{float:right}.actions-toolbar .primary,.actions-toolbar .secondary{display:inline-block}.actions-toolbar .primary a.action,.actions-toolbar .secondary a.action{display:inline-block}.actions-toolbar .primary .action{margin:0 5px 0 0}.actions-toolbar .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-1:before,.example-actions-toolbar-1:after{content:"";display:table}.example-actions-toolbar-1:after{clear:both}.example-actions-toolbar-1 .primary{float:left}.example-actions-toolbar-1 .secondary{float:right}.example-actions-toolbar-1 .primary,.example-actions-toolbar-1 .secondary{display:inline-block}.example-actions-toolbar-1 .primary a.action,.example-actions-toolbar-1 .secondary a.action{display:inline-block}.example-actions-toolbar-1 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-1 .secondary a.action{margin-top:6px}.example-actions-toolbar-2:before,.example-actions-toolbar-2:after{content:"";display:table}.example-actions-toolbar-2:after{clear:both}.example-actions-toolbar-2 .primary{float:left}.example-actions-toolbar-2 .secondary{float:right}.example-actions-toolbar-2 .primary,.example-actions-toolbar-2 .secondary{display:inline-block}.example-actions-toolbar-2 .primary a.action,.example-actions-toolbar-2 .secondary a.action{display:inline-block}.example-actions-toolbar-2 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-2 .secondary a.action{margin-top:6px}.example-actions-toolbar-3{text-align:left}.example-actions-toolbar-3:before,.example-actions-toolbar-3:after{content:"";display:table}.example-actions-toolbar-3:after{clear:both}.example-actions-toolbar-3 .primary{float:left}.example-actions-toolbar-3 .primary,.example-actions-toolbar-3 .secondary{display:inline-block}.example-actions-toolbar-3 .primary a.action,.example-actions-toolbar-3 .secondary a.action{display:inline-block}.example-actions-toolbar-3 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-3 .secondary a.action{margin-top:6px}.example-actions-toolbar-4{text-align:right}.example-actions-toolbar-4:before,.example-actions-toolbar-4:after{content:"";display:table}.example-actions-toolbar-4:after{clear:both}.example-actions-toolbar-4 .secondary{float:right}.example-actions-toolbar-4 .primary,.example-actions-toolbar-4 .secondary{display:inline-block}.example-actions-toolbar-4 .primary a.action,.example-actions-toolbar-4 .secondary a.action{display:inline-block}.example-actions-toolbar-4 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-4 .secondary a.action{margin-top:6px}.example-actions-toolbar-5{text-align:center}.example-actions-toolbar-5:before,.example-actions-toolbar-5:after{content:"";display:table}.example-actions-toolbar-5:after{clear:both}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{vertical-align:top}.example-actions-toolbar-5 .primary,.example-actions-toolbar-5 .secondary{display:inline-block}.example-actions-toolbar-5 .primary a.action,.example-actions-toolbar-5 .secondary a.action{display:inline-block}.example-actions-toolbar-5 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-5 .secondary a.action{margin-top:6px}.example-actions-toolbar-6:before,.example-actions-toolbar-6:after{content:"";display:table}.example-actions-toolbar-6:after{clear:both}.example-actions-toolbar-6 .primary{float:right}.example-actions-toolbar-6 .secondary{float:left}.example-actions-toolbar-6 .primary,.example-actions-toolbar-6 .secondary{display:inline-block}.example-actions-toolbar-6 .primary a.action,.example-actions-toolbar-6 .secondary a.action{display:inline-block}.example-actions-toolbar-6 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-6 .secondary a.action{margin-top:6px}.example-actions-toolbar-7{text-align:left}.example-actions-toolbar-7:before,.example-actions-toolbar-7:after{content:"";display:table}.example-actions-toolbar-7:after{clear:both}.example-actions-toolbar-7 .secondary{float:left}.example-actions-toolbar-7 .primary,.example-actions-toolbar-7 .secondary{display:inline-block}.example-actions-toolbar-7 .primary a.action,.example-actions-toolbar-7 .secondary a.action{display:inline-block}.example-actions-toolbar-7 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-7 .secondary a.action{margin-top:6px}.example-actions-toolbar-8{text-align:right}.example-actions-toolbar-8:before,.example-actions-toolbar-8:after{content:"";display:table}.example-actions-toolbar-8:after{clear:both}.example-actions-toolbar-8 .primary{float:right}.example-actions-toolbar-8 .primary,.example-actions-toolbar-8 .secondary{display:inline-block}.example-actions-toolbar-8 .primary a.action,.example-actions-toolbar-8 .secondary a.action{display:inline-block}.example-actions-toolbar-8 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-8 .secondary a.action{margin-top:6px}.example-actions-toolbar-9{margin:10px;padding:10px}.example-actions-toolbar-9:before,.example-actions-toolbar-9:after{content:"";display:table}.example-actions-toolbar-9:after{clear:both}.example-actions-toolbar-9 .primary{float:left}.example-actions-toolbar-9 .secondary{float:right}.example-actions-toolbar-9 .primary,.example-actions-toolbar-9 .secondary{display:inline-block}.example-actions-toolbar-9 .primary a.action,.example-actions-toolbar-9 .secondary a.action{display:inline-block}.example-actions-toolbar-9 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-9 .secondary a.action{margin-top:6px}.example-actions-toolbar-10{text-align:left}.example-actions-toolbar-10:before,.example-actions-toolbar-10:after{content:"";display:table}.example-actions-toolbar-10:after{clear:both}.example-actions-toolbar-10 .primary{float:left}.example-actions-toolbar-10 .primary,.example-actions-toolbar-10 .secondary{display:inline-block}.example-actions-toolbar-10 .primary a.action,.example-actions-toolbar-10 .secondary a.action{display:inline-block}.example-actions-toolbar-10 .primary .action{margin:0 50px 0 0}.example-actions-toolbar-10 .secondary a.action{margin-top:6px}.example-actions-toolbar-11{text-align:left}.example-actions-toolbar-11:before,.example-actions-toolbar-11:after{content:"";display:table}.example-actions-toolbar-11:after{clear:both}.example-actions-toolbar-11 .primary{float:left}.example-actions-toolbar-11 .primary,.example-actions-toolbar-11 .secondary{display:inline-block}.example-actions-toolbar-11 .primary a.action,.example-actions-toolbar-11 .secondary a.action{display:inline-block}.example-actions-toolbar-11 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-11 .secondary .action{margin:0 50px 0 0}.example-actions-toolbar-11 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}.example-actions-toolbar-12:before,.example-actions-toolbar-12:after{content:"";display:table}.example-actions-toolbar-12:after{clear:both}.example-actions-toolbar-12 .primary{float:left}.example-actions-toolbar-12 .secondary{float:right}.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{display:inline-block}.example-actions-toolbar-12 .primary a.action,.example-actions-toolbar-12 .secondary a.action{display:inline-block}.example-actions-toolbar-12 .primary .action{margin:0 5px 0 0}.example-actions-toolbar-12 .secondary a.action{margin-top:6px}@media only screen and (max-width: 768px){.example-actions-toolbar-12 .primary,.example-actions-toolbar-12 .secondary{ display:block;float:none}}.example-breadcrumbs-1{margin:0 0 20px}.example-breadcrumbs-1 .items{font-size:1.2rem;color:#a3a3a3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-1 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-1 .item{margin:0}.example-breadcrumbs-1 a{color:#333;text-decoration:none}.example-breadcrumbs-1 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-1 a:hover{color:#333;text-decoration:underline}.example-breadcrumbs-1 a:active{color:#333;text-decoration:none}.example-breadcrumbs-1 strong{font-weight:400}.example-breadcrumbs-1 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-1 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-2{margin:0 0 20px}.example-breadcrumbs-2 .items{font-size:1.2rem;color:#1979c3;margin:0;padding:0;list-style:none none}.example-breadcrumbs-2 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-2 .item{margin:0}.example-breadcrumbs-2 a{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #ccc;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-2 a:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 a:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#333;text-decoration:none}.example-breadcrumbs-2 strong{background-color:#ff5501;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f7b32e 0, #ff5501 100%);background-image:linear-gradient(to bottom, #f7b32e 0, #ff5501 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7b32e', endColorstr='#ff5501', GradientType=0);border:1px solid #d04b0a;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-2 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-2 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3{margin:0 0 20px}.example-breadcrumbs-3 .items{font-size:1.2rem;color:#333;margin:0;padding:0;list-style:none none}.example-breadcrumbs-3 .items>li{display:inline-block;vertical-align:top}.example-breadcrumbs-3 .item{margin:0}.example-breadcrumbs-3 a{background:#f4f4f4;display:inline-block;padding:3px 5px;color:#333;text-decoration:none}.example-breadcrumbs-3 a:visited{color:#333;text-decoration:none}.example-breadcrumbs-3 a:hover{background:#ccc;color:#333;text-decoration:none}.example-breadcrumbs-3 a:active{color:#333;text-decoration:none}.example-breadcrumbs-3 strong{background:#e7e7e7;display:inline-block;padding:3px 5px;font-weight:400}.example-breadcrumbs-3 .item:not(:last-child){display:inline-block;text-decoration:none}.example-breadcrumbs-3 .item:not(:last-child):after{font-family:'icons-blank-theme';content:'\e608';font-size:24px;line-height:18px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-breadcrumbs-3 .item a{position:relative;margin:0 11px 0 0}.example-breadcrumbs-3 .item a:after{border:12px solid transparent;height:0;width:0;border-left-color:#f4f4f4;content:"";position:absolute;display:block;top:0;right:-23px}.example-breadcrumbs-3 .item a:hover:after{border-color:transparent transparent transparent #ccc}button{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}button:focus,button:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}button:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}button.disabled,button[disabled],fieldset[disabled] button{cursor:default;pointer-events:none;opacity:.5}button:active,button:focus{box-shadow:inset 0 2px 1px rgba(0,0,0,.12)}.example-button-1.example-button-2{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-button-1.example-button-3{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;border-radius:0;color:#000}.example-button-1.example-button-3:hover,.example-button-1.example-button-3.active{color:#000}.example-button-10{background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-10>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-button-10:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-10:hover:before{color:inherit}.example-button-10:active:before{color:inherit}.example-button-10:focus,.example-button-10:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-10:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:default;pointer-events:none;opacity:.5}.example-button-10:focus,.example-button-10:active{background:0;border:0}.example-button-10:hover{background:0;border:0}.example-button-10.disabled,.example-button-10[disabled],fieldset[disabled] .example-button-10{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-11{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-11:before{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-11:hover:before{color:inherit}.example-button-11:active:before{color:inherit}.example-button-11:focus,.example-button-11:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-11:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-11.disabled,.example-button-11[disabled],fieldset[disabled] .example-button-11{cursor:default;pointer-events:none;opacity:.5}.example-button-12{background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;display:inline-block;text-decoration:none}.example-button-12:after{font-family:'icons-blank-theme';content:'\e611';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-button-12:hover:after{color:inherit}.example-button-12:active:after{color:inherit}.example-button-12:focus,.example-button-12:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-12:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-12.disabled,.example-button-12[disabled],fieldset[disabled] .example-button-12{cursor:default;pointer-events:none;opacity:.5}.example-button-13{background-image:none;background:#f2f2f2;padding:7px 15px;width:100px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-13:focus,.example-button-13:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-13:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-13.disabled,.example-button-13[disabled],fieldset[disabled] .example-button-13{cursor:default;pointer-events:none;opacity:.5}.example-button-4{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;margin:3px;vertical-align:middle}.example-button-4:focus,.example-button-4:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-4.disabled,.example-button-4[disabled],fieldset[disabled] .example-button-4{cursor:default;pointer-events:none;opacity:.5}.example-button-4:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-4.example-button-5{line-height:2.2rem;padding:7px 35px;font-size:1.8rem}.example-button-4.example-button-6{line-height:1.2rem;padding:5px 8px;font-size:1.1rem;color:#fff}.example-button-4.example-button-6:hover,.example-button-4.example-button-6.active{color:#fff}.example-button-7{background-image:none;background:#f2f2f2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #1979c3 0, #006bb4 100%);background-image:linear-gradient(to bottom, #1979c3 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1979c3', endColorstr='#006bb4', GradientType=0);padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:3px;vertical-align:middle;border-radius:3px}.example-button-7:focus,.example-button-7:active{background:#e2e2e2;background-color:#006bb4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #006bb4 100%);background-image:linear-gradient(to bottom, #006bb4 0, #006bb4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#006bb4', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7:hover{background:#e2e2e2;background-color:#1979c3;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #006bb4 0, #1979c3 100%);background-image:linear-gradient(to bottom, #006bb4 0, #1979c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006bb4', endColorstr='#1979c3', GradientType=0);border:1px solid #006bb4;color:#fff}.example-button-7.disabled,.example-button-7[disabled],fieldset[disabled] .example-button-7{cursor:default;pointer-events:none;opacity:.5}.example-button-7:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-8{background:0;border:0;display:inline;line-height:1.42857143;margin:0;padding:0;color:#1979c3;text-decoration:none;font-weight:400}.example-button-8:visited{color:#1979c3;text-decoration:none}.example-button-8:hover{color:#006bb4;text-decoration:underline}.example-button-8:active{color:#ff5501;text-decoration:underline}.example-button-8:hover{color:#006bb4}.example-button-8:hover,.example-button-8:active,.example-button-8:focus{background:0;border:0}.example-button-8.disabled,.example-button-8[disabled],fieldset[disabled] .example-button-8{color:#1979c3;text-decoration:underline;cursor:default;pointer-events:none;opacity:.5}.example-button-8:active{box-shadow:none}.example-button-9{text-decoration:none;background-image:none;background:#f2f2f2;padding:7px 15px;color:#333;border:1px solid #cdcdcd;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;line-height:1.6rem;box-sizing:border-box;margin:0;vertical-align:middle;margin:3px;border-radius:3px;font-weight:700}.example-button-9:hover,.example-button-9:active,.example-button-9:focus{text-decoration:none}.example-button-9:focus,.example-button-9:active{background:#e2e2e2;border:1px solid #cdcdcd;color:#333}.example-button-9:hover{background:#e2e2e2;border:1px solid #cdcdcd;color:#555}.example-button-9.disabled,.example-button-9[disabled],fieldset[disabled] .example-button-9{cursor:default;pointer-events:none;opacity:.5}.example-button-9:active{box-shadow:inset 0 3px 1px rgba(0,0,0,.29)}.example-button-14{background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400}.example-button-14:focus,.example-button-14:active{background:0;border:0}.example-button-14:hover{background:0;border:0}.example-button-14.disabled,.example-button-14[disabled],fieldset[disabled] .example-button-14{cursor:not-allowed;pointer-events:none;opacity:.5}.example-button-15{background-image:none;background:#1979c3;padding:7px 15px;color:#fff;border:1px solid #1979c3;cursor:pointer;display:inline-block;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;box-sizing:border-box;vertical-align:middle;background:#f2f2f2;color:#333;border:1px solid #cdcdcd}.example-button-15:focus,.example-button-15:active{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15:hover{background:#006bb4;border:1px solid #006bb4;color:#fff}.example-button-15.disabled,.example-button-15[disabled],fieldset[disabled] .example-button-15{cursor:default;pointer-events:none;opacity:.5}.example-button-15:focus,.example-button-15:active{background:#e2e2e2;color:#333;border:1px solid #cdcdcd}.example-button-15:hover{background:#e2e2e2;color:#555;border:1px solid #cdcdcd}.example-button-17{line-height:2.2rem;padding:14px 17px;font-size:1.8rem;font-size:1.4rem;line-height:1.6rem;padding:7px 15px}.example-button-18{font-size:1rem;line-height:1.2rem;padding:4px 10px}.example-dropdown-1{display:inline-block;position:relative}.example-dropdown-1:before,.example-dropdown-1:after{content:"";display:table}.example-dropdown-1:after{clear:both}.example-dropdown-1 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle:hover:after{color:inherit}.example-dropdown-1 .action.toggle:active:after{color:inherit}.example-dropdown-1 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-1 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-1 .action.toggle.active:hover:after{color:inherit}.example-dropdown-1 .action.toggle.active:active:after{color:inherit}.example-dropdown-1 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-1 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-1 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-1 ul.dropdown:before,.example-dropdown-1 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-1 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-1 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-1 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-1 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-1.active{overflow:visible}.example-dropdown-1.active ul.dropdown{display:block}.example-dropdown-2{display:inline-block;position:relative}.example-dropdown-2:before,.example-dropdown-2:after{content:"";display:table}.example-dropdown-2:after{clear:both}.example-dropdown-2 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle:hover:after{color:inherit}.example-dropdown-2 .action.toggle:active:after{color:inherit}.example-dropdown-2 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-2 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-2 .action.toggle.active:hover:after{color:inherit}.example-dropdown-2 .action.toggle.active:active:after{color:inherit}.example-dropdown-2 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-2 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-2 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-2 ul.dropdown:before,.example-dropdown-2 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-2 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-2 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-2 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-2 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-2.active{overflow:visible}.example-dropdown-2.active ul.dropdown{display:block}.example-dropdown-3{display:inline-block;position:relative}.example-dropdown-3:before,.example-dropdown-3:after{content:"";display:table}.example-dropdown-3:after{clear:both}.example-dropdown-3 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle:hover:before{color:red}.example-dropdown-3 .action.toggle:active:before{color:inherit}.example-dropdown-3 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-3 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:1;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-3 .action.toggle.active:hover:before{color:red}.example-dropdown-3 .action.toggle.active:active:before{color:inherit}.example-dropdown-3 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-3 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-3 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-3 ul.dropdown:before,.example-dropdown-3 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-3 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-3 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-3 ul.dropdown:before{top:-12px;left:10px}.example-dropdown-3 ul.dropdown:after{top:-14px;left:9px}.example-dropdown-3.active{overflow:visible}.example-dropdown-3.active ul.dropdown{display:block}.example-dropdown-5{display:inline-block;position:relative}.example-dropdown-5:before,.example-dropdown-5:after{content:"";display:table}.example-dropdown-5:after{clear:both}.example-dropdown-5 .action.toggle{cursor:pointer;display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle:hover:after{color:inherit}.example-dropdown-5 .action.toggle:active:after{color:inherit}.example-dropdown-5 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-5 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:1;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-5 .action.toggle.active:hover:after{color:inherit}.example-dropdown-5 .action.toggle.active:active:after{color:inherit}.example-dropdown-5 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-5 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-5 ul.dropdown li:first-child{border:0}.example-dropdown-5 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-5.active{overflow:visible}.example-dropdown-5.active ul.dropdown{display:block}.example-dropdown-6{display:inline-block;position:relative}.example-dropdown-6:before,.example-dropdown-6:after{content:"";display:table}.example-dropdown-6:after{clear:both}.example-dropdown-6 .action.split{float:left;margin:0}.example-dropdown-6 .action.toggle{float:right;margin:0}.example-dropdown-6 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-6 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-6 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle:hover:after{color:inherit}.example-dropdown-6 .action.toggle:active:after{color:inherit}.example-dropdown-6 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-6 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-6 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-6 .action.toggle.active:hover:after{color:inherit}.example-dropdown-6 .action.toggle.active:active:after{color:inherit}.example-dropdown-6 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-6 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-6 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-6 ul.dropdown:before,.example-dropdown-6 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-6 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-6 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-6 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-6 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-6.active{overflow:visible}.example-dropdown-6.active ul.dropdown{display:block}.split.example-dropdown-7{display:inline-block;position:relative}.split.example-dropdown-7:before,.split.example-dropdown-7:after{content:"";display:table}.split.example-dropdown-7:after{clear:both}.split.example-dropdown-7 .action.split{float:left;margin:0}.split.example-dropdown-7 .action.toggle{float:right;margin:0}.split.example-dropdown-7 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle:active:after{color:inherit}.split.example-dropdown-7 .action.toggle.active{display:inline-block;text-decoration:none}.split.example-dropdown-7 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.split.example-dropdown-7 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.split.example-dropdown-7 .action.toggle.active:hover:after{color:inherit}.split.example-dropdown-7 .action.toggle.active:active:after{color:inherit}.split.example-dropdown-7 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.split.example-dropdown-7 ul.dropdown li{margin:0;padding:3px 5px}.split.example-dropdown-7 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.split.example-dropdown-7 ul.dropdown:before,.split.example-dropdown-7 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.split.example-dropdown-7 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.split.example-dropdown-7 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.split.example-dropdown-7 ul.dropdown:before{top:-12px;right:10px}.split.example-dropdown-7 ul.dropdown:after{top:-14px;right:9px}.split.example-dropdown-7.active{overflow:visible}.split.example-dropdown-7.active ul.dropdown{display:block}.example-dropdown-8{display:inline-block;position:relative}.example-dropdown-8:before,.example-dropdown-8:after{content:"";display:table}.example-dropdown-8:after{clear:both}.example-dropdown-8 .action.split{float:left;margin:0}.example-dropdown-8 .action.toggle{float:right;margin:0}.example-dropdown-8 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-8 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-8 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle:hover:after{color:inherit}.example-dropdown-8 .action.toggle:active:after{color:inherit}.example-dropdown-8 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-8 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-8 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-8 .action.toggle.active:hover:after{color:inherit}.example-dropdown-8 .action.toggle.active:active:after{color:inherit}.example-dropdown-8 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-8 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-8 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-8 ul.dropdown:before,.example-dropdown-8 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-8 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-8 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-8 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-8 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-8.active{overflow:visible}.example-dropdown-8.active ul.dropdown{display:block}.example-dropdown-9{display:inline-block;position:relative}.example-dropdown-9 .action.split,.example-dropdown-9 .action.toggle{line-height:2.2rem;padding:14px 17px;font-size:1.8rem}.example-dropdown-9:before,.example-dropdown-9:after{content:"";display:table}.example-dropdown-9:after{clear:both}.example-dropdown-9 .action.split{float:left;margin:0}.example-dropdown-9 .action.toggle{float:right;margin:0}.example-dropdown-9 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-9 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-9 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle:hover:after{color:inherit}.example-dropdown-9 .action.toggle:active:after{color:inherit}.example-dropdown-9 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-9 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-9 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-9 .action.toggle.active:hover:after{color:inherit}.example-dropdown-9 .action.toggle.active:active:after{color:inherit}.example-dropdown-9 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-9 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-9 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-9 ul.dropdown:before,.example-dropdown-9 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-9 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-9 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-9 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-9 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-9.active{overflow:visible}.example-dropdown-9.active ul.dropdown{display:block}.example-dropdown-10{display:inline-block;position:relative}.example-dropdown-10 .action.split,.example-dropdown-10 .action.toggle{line-height:1.2rem;padding:5px 8px;font-size:1.1rem}.example-dropdown-10:before,.example-dropdown-10:after{content:"";display:table}.example-dropdown-10:after{clear:both}.example-dropdown-10 .action.split{float:left;margin:0}.example-dropdown-10 .action.toggle{float:right;margin:0}.example-dropdown-10 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-10 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-10 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle:hover:after{color:inherit}.example-dropdown-10 .action.toggle:active:after{color:inherit}.example-dropdown-10 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-10 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-10 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-10 .action.toggle.active:hover:after{color:inherit}.example-dropdown-10 .action.toggle.active:active:after{color:inherit}.example-dropdown-10 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-10 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-10 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-10 ul.dropdown:before,.example-dropdown-10 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-10 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-10 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-10 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-10 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-10.active{overflow:visible}.example-dropdown-10.active ul.dropdown{display:block}.example-dropdown-11{display:inline-block;position:relative}.example-dropdown-11:before,.example-dropdown-11:after{content:"";display:table}.example-dropdown-11:after{clear:both}.example-dropdown-11 .action.split{float:right;margin:0}.example-dropdown-11 .action.toggle{float:left;margin:0}.example-dropdown-11 button.action.split{border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-11 button+.action.toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-11 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle:before{font-family:'icons-blank-theme';content:'\e61c';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle:hover:before{color:red}.example-dropdown-11 .action.toggle:active:before{color:inherit}.example-dropdown-11 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-11 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-11 .action.toggle.active:before{font-family:'icons-blank-theme';content:'\e60f';font-size:22px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-11 .action.toggle.active:hover:before{color:red}.example-dropdown-11 .action.toggle.active:active:before{color:inherit}.example-dropdown-11 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#fff;border:1px solid #bbb;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none;box-shadow:0 3px 3px rgba(0,0,0,.15)}.example-dropdown-11 ul.dropdown li{margin:0;padding:3px 5px}.example-dropdown-11 ul.dropdown li:hover{background:#e8e8e8;cursor:pointer}.example-dropdown-11 ul.dropdown:before,.example-dropdown-11 ul.dropdown:after{content:"";position:absolute;display:block;width:0;height:0;border-bottom-style:solid}.example-dropdown-11 ul.dropdown:before{z-index:99;border:solid 6px;border-color:transparent transparent #fff transparent}.example-dropdown-11 ul.dropdown:after{z-index:98;border:solid 7px;border-color:transparent transparent #bbb transparent}.example-dropdown-11 ul.dropdown:before{top:-12px;right:10px}.example-dropdown-11 ul.dropdown:after{top:-14px;right:9px}.example-dropdown-11.active{overflow:visible}.example-dropdown-11.active ul.dropdown{display:block}.example-dropdown-12{display:inline-block;position:relative}.example-dropdown-12:before,.example-dropdown-12:after{content:"";display:table}.example-dropdown-12:after{clear:both}.example-dropdown-12 .action.split{float:left;margin:0}.example-dropdown-12 .action.toggle{float:right;margin:0}.example-dropdown-12 button.action.split{border-top-right-radius:0;border-bottom-right-radius:0}.example-dropdown-12 button+.action.toggle{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.example-dropdown-12 .action.toggle{padding:4px 5px;display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle:after{font-family:'icons-blank-theme';content:'\e607';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle:hover:after{color:inherit}.example-dropdown-12 .action.toggle:active:after{color:inherit}.example-dropdown-12 .action.toggle.active{display:inline-block;text-decoration:none}.example-dropdown-12 .action.toggle.active>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-dropdown-12 .action.toggle.active:after{font-family:'icons-blank-theme';content:'\e618';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.example-dropdown-12 .action.toggle.active:hover:after{color:inherit}.example-dropdown-12 .action.toggle.active:active:after{color:inherit}.example-dropdown-12 ul.dropdown{margin:0;padding:0;list-style:none none;box-sizing:border-box;background:#eef1f3;border:2px solid #ced1d4;position:absolute;z-index:100;top:100%;min-width:100%;margin-top:4px;display:none}.example-dropdown-12 ul.dropdown li{margin:0;padding:10px;border-top:2px solid #e8eaed}.example-dropdown-12 ul.dropdown li:first-child{border:0}.example-dropdown-12 ul.dropdown li:hover{background:#d8e3e3;cursor:pointer}.example-dropdown-12.active{overflow:visible}.example-dropdown-12.active ul.dropdown{display:block}.example-form-1 .example-form-1-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-1 .example-form-1-fieldset>*{letter-spacing:normal}.example-form-1 .example-form-1-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-1 .example-form-1-fieldset:after{content:attr(data-hasrequired);display:block;font-size:1.2rem;color:#e02b27;margin:10px 0 0;letter-spacing:normal;word-spacing:normal}.example-form-1 .example-form-1-fieldset>.field{margin:0 0 20px}.example-form-1 .example-form-1-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-1 .example-form-1-fieldset>.field:last-child{margin-bottom:0}.example-form-1 .example-form-1-fieldset>.field>.label{font-weight:700}.example-form-1 .example-form-1-fieldset>.field>.label+br{display:none}.example-form-1 .example-form-1-fieldset>.field .choice input{vertical-align:top}.example-form-1 .example-form-1-fieldset>.field .fields.group:before,.example-form-1 .example-form-1-fieldset>.field .fields.group:after{content:"";display:table}.example-form-1 .example-form-1-fieldset>.field .fields.group:after{clear:both}.example-form-1 .example-form-1-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-1 .example-form-1-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-1 .example-form-1-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-1 .example-form-1-fieldset>.field .addon textarea,.example-form-1 .example-form-1-fieldset>.field .addon select,.example-form-1 .example-form-1-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;display:inline-block;margin:0;width:auto}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore,.example-form-1 .example-form-1-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:disabled,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-1 .example-form-1-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-1 .example-form-1-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-1 .example-form-1-fieldset>.field .additional{margin-top:10px}.example-form-1 .example-form-1-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-1 .example-form-1-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-1 .example-form-1-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-form-2 .example-form-2-fieldset{padding:0;margin:0 0 40px;border:0;letter-spacing:-.31em}.example-form-2 .example-form-2-fieldset>*{letter-spacing:normal}.example-form-2 .example-form-2-fieldset>.legend{margin:0 0 25px;padding:0;font-size:2rem;line-height:1.2;box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.legend+br{display:block;visibility:hidden;height:0;overflow:hidden;clear:both}.example-form-2 .example-form-2-fieldset>.field{margin:0 0 20px;box-sizing:border-box;display:inline-block;padding:0 12px 0 0;width:50%;vertical-align:top}.example-form-2 .example-form-2-fieldset>.field>.label{display:inline-block;margin:0 0 5px}.example-form-2 .example-form-2-fieldset>.field:last-child{margin-bottom:0}.example-form-2 .example-form-2-fieldset>.field+.fieldset{clear:both}.example-form-2 .example-form-2-fieldset>.field>.label{font-weight:700}.example-form-2 .example-form-2-fieldset>.field>.label+br{display:none}.example-form-2 .example-form-2-fieldset>.field .choice input{vertical-align:top}.example-form-2 .example-form-2-fieldset>.field .fields.group:before,.example-form-2 .example-form-2-fieldset>.field .fields.group:after{content:"";display:table}.example-form-2 .example-form-2-fieldset>.field .fields.group:after{clear:both}.example-form-2 .example-form-2-fieldset>.field .fields.group .field{box-sizing:border-box;float:left}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-2 .field{width:50%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-3 .field{width:33.3%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-4 .field{width:25%!important}.example-form-2 .example-form-2-fieldset>.field .fields.group.group-5 .field{width:20%!important}.example-form-2 .example-form-2-fieldset>.field .addon{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:0;width:100%}.example-form-2 .example-form-2-fieldset>.field .addon textarea,.example-form-2 .example-form-2-fieldset>.field .addon select,.example-form-2 .example-form-2-fieldset>.field .addon input{-ms-flex-order:2;-webkit-order:2;order:2;-webkit-flex-basis:100%;flex-basis:100%;display:inline-block;margin:0;width:auto}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore,.example-form-2 .example-form-2-fieldset>.field .addon .addafter{-ms-flex-order:3;-webkit-order:3;order:3;display:inline-block;box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;width:auto;white-space:nowrap;vertical-align:middle}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:disabled,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:disabled{opacity:.5}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-moz-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-moz-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore::-webkit-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter::-webkit-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore:-ms-input-placeholder,.example-form-2 .example-form-2-fieldset>.field .addon .addafter:-ms-input-placeholder{color:#c2c2c2}.example-form-2 .example-form-2-fieldset>.field .addon .addbefore{float:left;-ms-flex-order:1;-webkit-order:1;order:1}.example-form-2 .example-form-2-fieldset>.field .additional{margin-top:10px}.example-form-2 .example-form-2-fieldset>.field.required>.label:after{content:'*';font-size:1.2rem;color:#e02b27;margin:0 0 0 5px}.example-form-2 .example-form-2-fieldset>.field .note{font-size:1.2rem;margin:3px 0 0;padding:0;display:inline-block;text-decoration:none}.example-form-2 .example-form-2-fieldset>.field .note:before{font-family:'icons-blank-theme';content:'\e618';font-size:24px;line-height:12px;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}input[type="text"],input[type="password"],input[type="url"],input[type="tel"],input[type="search"],input[type="number"],input[type="datetime"],input[type="email"]{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:0 9px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}input[type="text"]:disabled,input[type="password"]:disabled,input[type="url"]:disabled,input[type="tel"]:disabled,input[type="search"]:disabled,input[type="number"]:disabled,input[type="datetime"]:disabled,input[type="email"]:disabled{opacity:.5}input[type="text"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="url"]::-moz-placeholder,input[type="tel"]::-moz-placeholder,input[type="search"]::-moz-placeholder,input[type="number"]::-moz-placeholder,input[type="datetime"]::-moz-placeholder,input[type="email"]::-moz-placeholder{color:#c2c2c2}input[type="text"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="url"]::-webkit-input-placeholder,input[type="tel"]::-webkit-input-placeholder,input[type="search"]::-webkit-input-placeholder,input[type="number"]::-webkit-input-placeholder,input[type="datetime"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder{color:#c2c2c2}input[type="text"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="url"]:-ms-input-placeholder,input[type="tel"]:-ms-input-placeholder,input[type="search"]:-ms-input-placeholder,input[type="number"]:-ms-input-placeholder,input[type="datetime"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder{color:#c2c2c2}select{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:32px;width:100%;padding:5px 10px 4px;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;margin-bottom:20px}select:disabled{opacity:.5}select[multiple="multiple"]{height:auto;margin-bottom:20px}textarea{box-sizing:border-box;background:#fff;border:1px solid #c2c2c2;border-radius:1px;height:auto;width:100%;padding:10px;margin:0;font-size:14px;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.428571429;background-clip:padding-box;vertical-align:baseline;resize:vertical}textarea:disabled{opacity:.5}textarea::-moz-placeholder{color:#c2c2c2}textarea::-webkit-input-placeholder{color:#c2c2c2}textarea:-ms-input-placeholder{color:#c2c2c2}input[type="checkbox"]{margin:2px 5px 0 0}input[type="checkbox"]:disabled{opacity:.5}input[type="radio"]{margin:2px 5px 0 0}input[type="radio"]:disabled{opacity:.5}input.text-example-1,select.select-example-1,textarea.textarea-example-1{background:#fdf0d5;border-color:#fc0;color:#b30000}input.text-example-1:focus,select.select-example-1:focus,textarea.textarea-example-1:focus{border-color:#cff;color:#060}input.text-example-1:disabled,select.select-example-1:disabled,textarea.textarea-example-1:disabled{color:#fcc}input.text-example-1::-moz-placeholder,textarea.textarea-example-1::-moz-placeholder{color:#ccc}input.text-example-1::-webkit-input-placeholder,textarea.textarea-example-1::-webkit-input-placeholder{color:#ccc}input.text-example-1:-ms-input-placeholder,textarea.textarea-example-1:-ms-input-placeholder{color:#ccc}.number-example{-moz-appearance:textfield}.number-example::-webkit-inner-spin-button,.number-example::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.search-example{-webkit-appearance:none}.search-example::-webkit-search-cancel-button,.search-example::-webkit-search-decoration,.search-example::-webkit-search-results-button,.search-example::-webkit-search-results-decoration{-webkit-appearance:none}input,textarea,select{font-size:1.2rem;color:#e02b27}.example-icon-1{display:inline-block}.example-icon-1:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-2{display:inline-block}.example-icon-2:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -26px 0}.example-icon-3{display:inline-block}.example-icon-3>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-3:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat -156px -52px}.example-icon-4{display:inline-block;text-decoration:none}.example-icon-4:before{font-family:'icons-blank-theme';content:'\e606';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-5{display:inline-block;text-decoration:none}.example-icon-5:after{font-family:'icons-blank-theme';content:'\e605';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-6{display:inline-block;text-decoration:none}.example-icon-6>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-icon-6:before{font-family:'icons-blank-theme';content:'\e61b';font-size:24px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-7{display:inline-block}.example-icon-7:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8{display:inline-block}.example-icon-8:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-8:before{background-position:-182px 0}.example-icon-9{display:inline-block}.example-icon-9:after{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-9:after{background-position:-52px -26px}.example-icon-10{display:inline-block}.example-icon-10:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-10:before{background-position:-104px 0}.example-icon-11{display:inline-block}.example-icon-11:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.example-icon-11:before{width:30px;height:30px}.example-icon-11:after{width:30px;height:30px}.example-icon-11:before{background-color:#f1f1f1}.example-icon-12{display:inline-block;text-decoration:none}.example-icon-12:before{font-family:'icons-blank-theme';content:'\e612';font-size:28px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13{display:inline-block;text-decoration:none}.example-icon-13:before{font-family:'icons-blank-theme';content:'\e612';font-size:inherit;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-13:before{font-size:26px;line-height:inherit}.example-icon-14{display:inline-block;text-decoration:none}.example-icon-14:before{font-family:'icons-blank-theme';content:'\e61d';font-size:26px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.example-icon-14>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.icons-image-list{list-style:none;padding:0}.icons-image-list li{float:left;width:33%}.icons-image-list li>span{display:inline-block}.icons-image-list li>span:before{content:'';display:inline-block;width:26px;height:26px;line-height:26px;vertical-align:middle;background:url('/pub/static/frontend/Magento/blank/en_US/images/blank-theme-icons.png') no-repeat 0 0}.icons-image-list li .icon-search:before{background-position:0 0}.icons-image-list li .icon-cart:before{background-position:-26px 0}.icons-image-list li .icon-arrow-down:before{background-position:-52px 0}.icons-image-list li .icon-arrow-up:before{background-position:-78px 0}.icons-image-list li .icon-grid:before{background-position:-104px 0}.icons-image-list li .icon-list:before{background-position:-130px 0}.icons-image-list li .icon-remove:before{background-position:-156px 0}.icons-image-list li .icon-star:before{background-position:-182px 0}.icons-image-list li .icon-pointer-down:before{background-position:-208px 0}.icons-image-list li .icon-pointer-up:before{background-position:-234px 0}.icons-image-list li .icon-pointer-left:before{background-position:-260px 0}.icons-image-list li .icon-pointer-right:before{background-position:-286px 0}.icons-image-list li .icon-compare-empty:before{background-position:0 -26px}.icons-image-list li .icon-compare-full:before{background-position:-26px -26px}.icons-image-list li .icon-wishlist-empty:before{background-position:-52px -26px}.icons-image-list li .icon-wishlist-full:before{background-position:-78px -26px}.icons-image-list li .icon-update:before{background-position:-104px -26px}.icons-image-list li .icon-collapse:before{background-position:-130px -26px}.icons-image-list li .icon-expand:before{background-position:-156px -26px}.icons-image-list li .icon-menu:before{background-position:-182px -26px}.icons-image-list li .icon-prev:before{background-position:-208px -26px}.icons-image-list li .icon-next:before{background-position:-234px -26px}.icons-image-list li .icon-settings:before{background-position:-260px -26px}.icons-image-list li .icon-info:before{background-position:-286px -26px}.icons-image-list li .icon-checkmark:before{background-position:0 -52px}.icons-image-list li .icon-calendar:before{background-position:-26px -52px}.icons-image-list li .icon-comment:before{background-position:-52px -52px}.icons-image-list li .icon-comment-reflected:before{background-position:-78px -52px}.icons-image-list li .icon-envelope:before{background-position:-104px -52px}.icons-image-list li .icon-warning:before{background-position:-130px -52px}.icons-image-list li .icon-trash:before{background-position:-156px -52px}.icons-image-list li .icon-flag:before{background-position:-182px -52px}.icons-image-list li .icon-location:before{background-position:-208px -52px}.icons-image-list li .icon-up:before{background-position:-234px -52px}.icons-image-list li .icon-down:before{background-position:-260px -52px}.icons-font-list{list-style:none;padding:0}.icons-font-list li{float:left;width:25%;margin-bottom:35px;text-align:center}.icons-font-list li>span{display:inline-block;text-decoration:none}.icons-font-list li>span:before{font-family:'icons-blank-theme';font-size:34px;line-height:inherit;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center}.icons-font-list li>span:before{content:attr(data-icon);margin:0 auto;display:block}.loader{position:fixed;top:0;right:0;bottom:0;left:0;background-color:rgba(255,255,255,.5);z-index:9999}.loader:before{border-radius:5px;background:transparent url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%;box-sizing:border-box;content:'';position:absolute;top:0;right:0;left:0;bottom:0;margin:auto;width:160px;height:160px}.loading{position:relative}.loading:before{content:'';position:absolute;left:0;top:0;right:0;bottom:0;background:rgba(255,255,255,.5) url('/pub/static/frontend/Magento/blank/en_US/images/loader-2.gif') no-repeat 50% 50%}.example-message-info{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-info a{color:#1979c3}.example-message-info a:hover{color:#006bb4}.example-message-info a:active{color:#006bb4}.example-message-warning{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-warning a{color:#1979c3}.example-message-warning a:hover{color:#006bb4}.example-message-warning a:active{color:#006bb4}.example-message-error{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27}.example-message-error a{color:#1979c3}.example-message-error a:hover{color:#006bb4}.example-message-error a:active{color:#006bb4}.example-message-success{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400}.example-message-success a{color:#1979c3}.example-message-success a:hover{color:#006bb4}.example-message-success a:active{color:#006bb4}.example-message-notice{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400}.example-message-notice a{color:#1979c3}.example-message-notice a:hover{color:#006bb4}.example-message-notice a:active{color:#006bb4}.example-message-1{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fdf0d5;color:#6f4400;position:relative;padding-left:40px}.example-message-1 a{color:#1979c3}.example-message-1 a:hover{color:#006bb4}.example-message-1 a:active{color:#006bb4}.example-message-1>:first-child:before{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#c07600;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:40px}.example-message-2{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fae5e5;color:#e02b27;position:relative;padding-right:40px}.example-message-2 a{color:#1979c3}.example-message-2 a:hover{color:#006bb4}.example-message-2 a:active{color:#006bb4}.example-message-2:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#b30000}.example-message-2>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-2>:first-child:after{font-family:'icons-blank-theme';content:'\e602';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-2:before{right:0}.example-message-2>:first-child:before{border:5px solid transparent;height:0;width:0;border-right-color:#b30000;right:30px}.example-message-2>:first-child:after{right:0}.example-message-3{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#e5efe5;color:#006400;position:relative;padding-left:40px}.example-message-3 a{color:#1979c3}.example-message-3 a:hover{color:#006bb4}.example-message-3 a:active{color:#006bb4}.example-message-3:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#006400}.example-message-3>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-3>:first-child:after{font-family:'icons-blank-theme';content:'\e610';font-size:28px;line-height:28px;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:18px;left:0;text-align:center;width:30px}.example-message-3:before{left:0}.example-message-3>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#006400;left:30px}.example-message-3>:first-child:after{left:0}.example-message-4{display:block;margin:0 0 10px;padding:10px 20px;font-size:1.3rem;line-height:1.2em;background:#fc0;border-color:#ffa500;color:#000;position:relative;padding-left:40px;border-width:4px;border-radius:10px}.example-message-4 a{color:#00f}.example-message-4 a:hover{color:#009}.example-message-4 a:active{color:#006}.example-message-4:before{content:'';position:absolute;width:30px;text-align:center;top:0;height:100%;display:block;padding:0;background:#green}.example-message-4>:first-child:before{content:'';position:absolute;overflow:hidden;top:50%;margin-top:-5px}.example-message-4>:first-child:after{font-family:'icons-blank-theme';content:'\e606';font-size:28px;line-height:28px;color:#000;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;margin:-14px 0 0;position:absolute;top:15px;left:0;text-align:center;width:30px}.example-message-4:before{left:0}.example-message-4>:first-child:before{border:5px solid transparent;height:0;width:0;border-left-color:#green;left:30px}.example-message-4>:first-child:after{left:0}header.header{background-color:rgba(255,0,0,.2)}.column.main{background-color:rgba(255,255,0,.2)}.column.left{background-color:rgba(0,255,255,.2)}.column.right{background-color:rgba(0,0,255,.2)}footer.footer{background-color:rgba(0,0,0,.2)}.columns{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.columns:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.columns>.column{padding-bottom:40px}@media (min-width: 600px){.page-layout-1column .column.main{ width:100%;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-3columns .column.main{width:66.66666667%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-left .column.main{width:83.33333333%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.main{width:83.33333333%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-left .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-2columns-right .column.left{width:16.66666667%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.page-layout-3columns .column.right{width:16.66666667%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.page-layout-2columns-left .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}.page-layout-2columns-right .column.right{width:16.66666667%;float:right;-ms-flex-order:2;-webkit-order:2;order:2}}.layout-example-3 .column.main{width:60%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3 .column.left{width:20%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.layout-example-3-1 .column.main{width:60%;float:left;-ms-flex-order:1;-webkit-order:1;order:1}.layout-example-3-1 .column.left{width:20%;display:inline-block;-ms-flex-order:2;-webkit-order:2;order:2}.layout-example-3-1 .column.right{width:20%;float:right;-ms-flex-order:3;-webkit-order:3;order:3}.pages>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.pages .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.pages .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.pages a.page:visited{color:#1979c3}.pages a.page:hover{color:#006bb4;text-decoration:none}.pages a.page:active{color:#ff5501}.pages strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.pages .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.pages .action:visited{color:#7d7d7d}.pages .action:hover{color:#7d7d7d;text-decoration:none}.pages .action:active{color:#7d7d7d}.pages .action.next{display:inline-block;text-decoration:none}.pages .action.next:visited:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.next:hover:before{color:#7d7d7d}.pages .action.next:active:before{color:#7d7d7d}.pages .action.previous{display:inline-block;text-decoration:none}.pages .action.previous:visited:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.pages .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.pages .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.pages .action.previous:hover:before{color:#7d7d7d}.pages .action.previous:active:before{color:#7d7d7d}.example-pages-1>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-1>.label:after{content:':'}.example-pages-1 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-1 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 3px;display:inline-block}.example-pages-1 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 a.page{background-color:#ccc;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #f4f4f4 0, #ccc 100%);background-image:linear-gradient(to bottom, #f4f4f4 0, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f4f4f4', endColorstr='#cccccc', GradientType=0);border:1px solid #b3b3b3;color:#333;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-1 a.page:visited{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#1979c3}.example-pages-1 a.page:hover{background-color:#f4f4f4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #ccc 0, #f4f4f4 100%);background-image:linear-gradient(to bottom, #ccc 0, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#f4f4f4', GradientType=0);border:1px solid #999;color:#333;text-decoration:none}.example-pages-1 a.page:active{background-color:false;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,false 0,false 100%);background-image:linear-gradient(to bottom,false 0,false 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='false', endColorstr='false', GradientType=0);color:#ff5501}.example-pages-1 strong.page{background:#1979c3;border:1px solid #135d96;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#f7b32e;display:inline-block;font-weight:700;padding:0 4px}.example-pages-1 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-1 .action:visited{color:#7d7d7d}.example-pages-1 .action:hover{color:#ff5501;text-decoration:none}.example-pages-1 .action:active{color:#7d7d7d}.example-pages-1 .action.next{display:inline-block;text-decoration:none}.example-pages-1 .action.next:visited:before{color:#7d7d7d}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.next:hover:before{color:#ff5501}.example-pages-1 .action.next:active:before{color:#7d7d7d}.example-pages-1 .action.previous{display:inline-block;text-decoration:none}.example-pages-1 .action.previous:visited:before{color:#7d7d7d}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-1 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-1 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:30px;line-height:inherit;color:#7d7d7d;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-1 .action.previous:hover:before{color:#ff5501}.example-pages-1 .action.previous:active:before{color:#7d7d7d}.example-pages-2>.label{display:inline-block;font-weight:700;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal}.example-pages-2>.label:after{content:':'}.example-pages-2 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-2 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-2 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-2 a.page{color:#1979c3;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-2 a.page:visited{color:#1979c3}.example-pages-2 a.page:hover{color:#006bb4;text-decoration:none}.example-pages-2 a.page:active{color:#ff5501}.example-pages-2 strong.page{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#333;display:inline-block;font-weight:700;padding:0 4px}.example-pages-2 .action{border:1px solid #d1d1d1;color:#7d7d7d;display:inline-block;padding:0;text-decoration:none}.example-pages-2 .action:visited{color:#7d7d7d}.example-pages-2 .action:hover{color:#7d7d7d;text-decoration:none}.example-pages-2 .action:active{color:#7d7d7d}.example-pages-3>.label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .items{font-size:0;line-height:0;letter-spacing:-1px;white-space:nowrap;margin:0;padding:0;list-style:none none;display:inline-block;font-weight:700}.example-pages-3 .item{font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;margin:0 2px 0 0;display:inline-block}.example-pages-3 .item .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 a.page{background:#1979c3;color:#fff;display:inline-block;padding:0 4px;text-decoration:none}.example-pages-3 a.page:visited{background:#1979c3;color:#fff}.example-pages-3 a.page:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 a.page:active{background:#ff5501;color:#fff}.example-pages-3 strong.page{background:#1979c3;font-size:1.2rem;font-size:12px;line-height:32px;letter-spacing:normal;color:#fff;display:inline-block;font-weight:700;padding:0 4px}.example-pages-3 .action{background:#1979c3;border:1px solid #d1d1d1;color:#fff;display:inline-block;padding:0;text-decoration:none}.example-pages-3 .action:visited{background:#1979c3;color:#7d7d7d}.example-pages-3 .action:hover{background:#006bb4;color:#fff;text-decoration:none}.example-pages-3 .action:active{background:#ff5501;color:#fff}.example-pages-3 .action.next{display:inline-block;text-decoration:none}.example-pages-3 .action.next:visited:before{color:#7d7d7d}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.next>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.next:before{font-family:'icons-blank-theme';content:'\e608';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.next:hover:before{color:#fff}.example-pages-3 .action.next:active:before{color:#fff}.example-pages-3 .action.previous{display:inline-block;text-decoration:none}.example-pages-3 .action.previous:visited:before{color:#7d7d7d}.example-pages-3 .action.previous:active:before{color:#fff}.example-pages-3 .action.previous>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-pages-3 .action.previous:before{font-family:'icons-blank-theme';content:'\e617';font-size:46px;line-height:inherit;color:#fff;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0 0 0 -6px}.example-pages-3 .action.previous:hover:before{color:#fff}.example-pages-3 .action.previous:active:before{color:#fff}.window.popup.popup-example{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example .popup-actions .action.close:focus,.window.popup.popup-example .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example .popup-actions .action.close.disabled,.window.popup.popup-example .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example.active{opacity:1}.window.popup.popup-example-1{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-1 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-1 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-1 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-1 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-1 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-1 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-1 .popup-actions .action.close:focus,.window.popup.popup-example-1 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-1 .popup-actions .action.close.disabled,.window.popup.popup-example-1 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-1 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-1.active{opacity:1}.window.overlay{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:1000;opacity:0}.window.overlay.active{opacity:.5;filter:alpha(opacity=50)}.window.popup.popup-example-2{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;overflow-y:auto;max-height:200px;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-2 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-2 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-2 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-2 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-2 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-2 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-2 .popup-actions .action.close:focus,.window.popup.popup-example-2 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-2 .popup-actions .action.close.disabled,.window.popup.popup-example-2 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-2 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-2.active{opacity:1}.window.popup.popup-example-3{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-3 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-3 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-3 .popup-content{overflow-y:auto;max-height:200px}.window.popup.popup-example-3 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-3 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-3 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-3 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-3 .popup-actions .action.close:focus,.window.popup.popup-example-3 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-3 .popup-actions .action.close.disabled,.window.popup.popup-example-3 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-3 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-3.active{opacity:1}.window.popup.popup-example-4{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-4 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-4 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-4 .popup-content{margin:0 0 20px}.window.popup.popup-example-4 .popup-footer{margin:0 20px}.window.popup.popup-example-4 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-4 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-4 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-4 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-4 .popup-actions .action.close:focus,.window.popup.popup-example-4 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-4 .popup-actions .action.close.disabled,.window.popup.popup-example-4 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-4 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-4.active{opacity:1}.window.popup.popup-example-5{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-5 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-5 .popup-header .title{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.window.popup.popup-example-5 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-5 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-5 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-5 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-5 .popup-actions .action.close:focus,.window.popup.popup-example-5 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-5 .popup-actions .action.close.disabled,.window.popup.popup-example-5 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-5 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-5.active{opacity:1}.window.popup.popup-example-6{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-6 .popup-footer .actions.toolbar{text-align:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar:before,.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{content:"";display:table}.window.popup.popup-example-6 .popup-footer .actions.toolbar:after{clear:both}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{float:left}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary a.action,.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{display:inline-block}.window.popup.popup-example-6 .popup-footer .actions.toolbar .primary .action{margin:0 5px 0 0}.window.popup.popup-example-6 .popup-footer .actions.toolbar .secondary a.action{margin-top:6px}.window.popup.popup-example-6 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-6 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-6 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-6 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-6 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-6 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-6 .popup-actions .action.close:focus,.window.popup.popup-example-6 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-6 .popup-actions .action.close.disabled,.window.popup.popup-example-6 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-6 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-6.active{opacity:1}.window.popup.popup-example-7{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-7 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-7 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-7 .popup-actions .action.close{position:absolute;top:10px;right:10px}.window.popup.popup-example-7.active{opacity:1}.window.popup.popup-example-8{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-8 .popup-header{margin:0 0 25px;padding-right:30px}.window.popup.popup-example-8 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-8 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-8 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e613';font-size:30px;line-height:22px;color:red;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:middle;text-align:center;margin:0}.window.popup.popup-example-8 .popup-actions .action.close:hover:before{color:#090}.window.popup.popup-example-8 .popup-actions .action.close:active:before{color:#00f}.window.popup.popup-example-8 .popup-actions .action.close:focus,.window.popup.popup-example-8 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-8 .popup-actions .action.close.disabled,.window.popup.popup-example-8 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-8 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-8.active{opacity:1}.window.popup.popup-example-9{background:#fff;border:1px solid #aeaeae;padding:22px;width:auto;box-shadow:0 3px 3px rgba(0,0,0,.15);top:0;right:0;bottom:0;left:0;display:none;opacity:0;position:fixed;z-index:1001;transition:opacity .3s linear}.window.popup.popup-example-9 .popup-header{margin:0 0 25px;padding-right:22px}.window.popup.popup-example-9 .popup-header .title{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}.window.popup.popup-example-9 .popup-actions .action.close{position:absolute;display:inline-block;background-image:none;background:0;border:0;margin:0;padding:0;-moz-box-sizing:content-box;box-shadow:none;text-shadow:none;text-decoration:none;line-height:inherit;font-weight:400;top:10px;right:10px}.window.popup.popup-example-9 .popup-actions .action.close>span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.window.popup.popup-example-9 .popup-actions .action.close:before{font-family:'icons-blank-theme';content:'\e616';font-size:22px;line-height:22px;color:inherit;overflow:hidden;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;display:inline-block;vertical-align:top;text-align:center;margin:0}.window.popup.popup-example-9 .popup-actions .action.close:hover:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:active:before{color:inherit}.window.popup.popup-example-9 .popup-actions .action.close:focus,.window.popup.popup-example-9 .popup-actions .action.close:active{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close:hover{background:0;border:0}.window.popup.popup-example-9 .popup-actions .action.close.disabled,.window.popup.popup-example-9 .popup-actions .action.close[disabled],fieldset[disabled] .window.popup.popup-example-9 .popup-actions .action.close{cursor:not-allowed;pointer-events:none;opacity:.5}.window.popup.popup-example-9.active{opacity:1}.window.overlay.example-overlay-1.active{transition:opacity .15s linear;position:fixed;top:0;right:0;bottom:0;left:0;background:#0f5293;z-index:1000;opacity:0}.window.overlay.example-overlay-1.active.active{opacity:.8;filter:alpha(opacity=80)}.example-ratings-1{overflow:hidden}.example-ratings-1:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-1 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 input[type="radio"]:focus+label:before,.example-ratings-1 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-1 label{position:absolute;display:block;cursor:pointer}.example-ratings-1 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-1 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-1 label:hover:before{opacity:1}.example-ratings-1 label:hover~label:before{opacity:0}.example-ratings-1 .rating-5{z-index:2}.example-ratings-1 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-4{z-index:3}.example-ratings-1 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-1 .rating-3{z-index:4}.example-ratings-1 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-1 .rating-2{z-index:5}.example-ratings-1 .rating-2:before{content:'\e605' '\e605'}.example-ratings-1 .rating-1{z-index:6}.example-ratings-1 .rating-1:before{content:'\e605'}.example-ratings-2{overflow:hidden}.example-ratings-2:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-2 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 input[type="radio"]:focus+label:before,.example-ratings-2 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-2 label{position:absolute;display:block;cursor:pointer}.example-ratings-2 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-2 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-2 label:hover:before{opacity:1}.example-ratings-2 label:hover~label:before{opacity:0}.example-ratings-2 .rating-8{z-index:2}.example-ratings-2 .rating-8:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-7{z-index:3}.example-ratings-2 .rating-7:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-6{z-index:4}.example-ratings-2 .rating-6:before{content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-5{z-index:5}.example-ratings-2 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-4{z-index:6}.example-ratings-2 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-2 .rating-3{z-index:7}.example-ratings-2 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-2 .rating-2{z-index:8}.example-ratings-2 .rating-2:before{content:'\e605' '\e605'}.example-ratings-2 .rating-1{z-index:9}.example-ratings-2 .rating-1:before{content:'\e605'}.example-ratings-3{overflow:hidden}.example-ratings-3:before{color:#aff5e3;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.example-ratings-3 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 input[type="radio"]:focus+label:before,.example-ratings-3 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-3 label{position:absolute;display:block;cursor:pointer}.example-ratings-3 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-3 label:before{color:#0a6767;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-3 label:hover:before{opacity:1}.example-ratings-3 label:hover~label:before{opacity:0}.example-ratings-3 .rating-5{z-index:2}.example-ratings-3 .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-4{z-index:3}.example-ratings-3 .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.example-ratings-3 .rating-3{z-index:4}.example-ratings-3 .rating-3:before{content:'\e605' '\e605' '\e605'}.example-ratings-3 .rating-2{z-index:5}.example-ratings-3 .rating-2:before{content:'\e605' '\e605'}.example-ratings-3 .rating-1{z-index:6}.example-ratings-3 .rating-1:before{content:'\e605'}.example-ratings-4{overflow:hidden}.example-ratings-4:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e600' '\e600' '\e600' '\e600' '\e600';position:absolute;z-index:1;display:block}.example-ratings-4 input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 input[type="radio"]:focus+label:before,.example-ratings-4 input[type="radio"]:checked+label:before{opacity:1}.example-ratings-4 label{position:absolute;display:block;cursor:pointer}.example-ratings-4 label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-ratings-4 label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.example-ratings-4 label:hover:before{opacity:1}.example-ratings-4 label:hover~label:before{opacity:0}.example-ratings-4 .rating-5{z-index:2}.example-ratings-4 .rating-5:before{content:'\e600' '\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-4{z-index:3}.example-ratings-4 .rating-4:before{content:'\e600' '\e600' '\e600' '\e600'}.example-ratings-4 .rating-3{z-index:4}.example-ratings-4 .rating-3:before{content:'\e600' '\e600' '\e600'}.example-ratings-4 .rating-2{z-index:5}.example-ratings-4 .rating-2:before{content:'\e600' '\e600'}.example-ratings-4 .rating-1{z-index:6}.example-ratings-4 .rating-1:before{content:'\e600'}.exapmle-ratings-5 .control.rating.vote{overflow:hidden}.exapmle-ratings-5 .control.rating.vote:before{color:#c7c7c7;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;content:'\e605' '\e605' '\e605' '\e605' '\e605';position:absolute;z-index:1;display:block}.exapmle-ratings-5 .control.rating.vote input[type="radio"]{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote input[type="radio"]:focus+label:before,.exapmle-ratings-5 .control.rating.vote input[type="radio"]:checked+label:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label{position:absolute;display:block;cursor:pointer}.exapmle-ratings-5 .control.rating.vote label span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.exapmle-ratings-5 .control.rating.vote label:before{color:#ff5601;font-family:'icons-blank-theme';font-style:normal;font-size:28px;line-height:28px;letter-spacing:-10px;height:28px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased;vertical-align:top;opacity:0}.exapmle-ratings-5 .control.rating.vote label:hover:before{opacity:1}.exapmle-ratings-5 .control.rating.vote label:hover~label:before{opacity:0}.exapmle-ratings-5 .control.rating.vote .rating-5{z-index:2}.exapmle-ratings-5 .control.rating.vote .rating-5:before{content:'\e605' '\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-4{z-index:3}.exapmle-ratings-5 .control.rating.vote .rating-4:before{content:'\e605' '\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-3{z-index:4}.exapmle-ratings-5 .control.rating.vote .rating-3:before{content:'\e605' '\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-2{z-index:5}.exapmle-ratings-5 .control.rating.vote .rating-2:before{content:'\e605' '\e605'}.exapmle-ratings-5 .control.rating.vote .rating-1{z-index:6}.exapmle-ratings-5 .control.rating.vote .rating-1:before{content:'\e605'}.example-rating-summary-1{white-space:nowrap;overflow:hidden}.example-rating-summary-1 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-1 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-1 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-1 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-2{white-space:nowrap;overflow:hidden}.example-rating-summary-2 .rating-result{width:154px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-2 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-2 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-2 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-3{white-space:nowrap;overflow:hidden}.example-rating-summary-3 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-3 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#aff5e3;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-3 .rating-result>span:before{position:relative;z-index:2;color:#0a6767;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-3 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-4{white-space:nowrap;overflow:hidden}.example-rating-summary-4 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-4 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-4 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e600' '\e600' '\e600' '\e600' '\e600';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-4 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5{white-space:nowrap;overflow:hidden}.example-rating-summary-5 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-5 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-5 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-5 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-5 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-6 .rating-summary{white-space:nowrap;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-6 .rating-summary .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span{display:block;overflow:hidden}.example-rating-summary-6 .rating-summary .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-6 .rating-summary .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7{white-space:nowrap;overflow:hidden}.example-rating-summary-7 .rating-result{width:100px;display:inline-block;vertical-align:middle;position:relative}.example-rating-summary-7 .rating-result:before{position:absolute;top:0;left:0;width:100%;z-index:1;color:#c7c7c7;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span{display:block;overflow:hidden}.example-rating-summary-7 .rating-result>span:before{position:relative;z-index:2;color:#ff5601;display:block;font-family:'icons-blank-theme';content:'\e605' '\e605' '\e605' '\e605' '\e605';font-style:normal;font-size:28px;height:28px;line-height:28px;letter-spacing:-10px;speak:none;font-weight:400;-webkit-font-smoothing:antialiased}.example-rating-summary-7 .rating-result>span span{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-rating-summary-7 .label{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-responsive-block{padding:10px}.example-sections-1{position:relative;z-index:1}.example-sections-1:before,.example-sections-1:after{content:"";display:table}.example-sections-1:after{clear:both}.example-sections-1>.item.title{float:left;width:auto}.example-sections-1>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-1>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-1>.item.content:before,.example-sections-1>.item.content:after{content:"";display:table}.example-sections-1>.item.content:after{clear:both}.example-sections-1>.item.content.active{display:block}.example-sections-1>.item.title{margin:0 5px 0 0}.example-sections-1>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-1>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-1>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-1>.item.title:not(.disabled)>.switch:focus,.example-sections-1>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-1>.item.title:not(.disabled)>.switch:active,.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-1>.item.title.active>.switch,.example-sections-1>.item.title.active>.switch:focus,.example-sections-1>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-1>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}.example-sections-2{position:relative;z-index:1}.example-sections-2:before,.example-sections-2:after{content:"";display:table}.example-sections-2:after{clear:both}.example-sections-2>.item.title{float:left;width:auto}.example-sections-2>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-2>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-2>.item.content:before,.example-sections-2>.item.content:after{content:"";display:table}.example-sections-2>.item.content:after{clear:both}.example-sections-2>.item.content.active{display:block}.example-sections-2>.item.title{margin:0 5px 0 0}.example-sections-2>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-2>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-2>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-2>.item.title:not(.disabled)>.switch:focus,.example-sections-2>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-2>.item.title:not(.disabled)>.switch:active,.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-2>.item.title.active>.switch,.example-sections-2>.item.title.active>.switch:focus,.example-sections-2>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-2>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:0;border-top:1px solid #d1d1d1}.example-sections-3{margin:0;padding:0}.example-sections-3>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-3>.item.title>.switch{display:block}.example-sections-3>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-3>.item.content:before,.example-sections-3>.item.content:after{content:"";display:table}.example-sections-3>.item.content:after{clear:both}.example-sections-3>.item.content.active{display:block}.example-sections-3>.item.title{margin:0 0 5px}.example-sections-3>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-3>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-3>.item.title:not(.disabled)>.switch:focus,.example-sections-3>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-3>.item.title:not(.disabled)>.switch:active,.example-sections-3>.item.title.active>.switch,.example-sections-3>.item.title.active>.switch:focus,.example-sections-3>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-3>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}@media only screen and (max-width: 99999px){.example-sections-4{ position:relative;z-index:1}.example-sections-4:before,.example-sections-4:after{content:"";display:table}.example-sections-4:after{clear:both}.example-sections-4>.item.title{float:left;width:auto}.example-sections-4>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-4>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 5px 0 0}.example-sections-4>.item.title>.switch{font-size:1.4rem;font-weight:600;line-height:20px;color:#7d7d7d;text-decoration:none;background:#f0f0f0;border:1px solid #d1d1d1;border-bottom:0;height:20px;padding:5px 20px 5px 20px}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;color:#333}.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{padding-bottom:6px}.example-sections-4>.item.content{background:#fff;margin-top:31px;padding:20px 20px 20px 20px;border:1px solid #d1d1d1}}@media only screen and (max-width: 768px){.example-sections-4{ margin:0;padding:0}.example-sections-4>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-4>.item.title>.switch{display:block}.example-sections-4>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-4>.item.content:before,.example-sections-4>.item.content:after{content:"";display:table}.example-sections-4>.item.content:after{clear:both}.example-sections-4>.item.content.active{display:block}.example-sections-4>.item.title{margin:0 0 5px}.example-sections-4>.item.title>.switch{background:#f0f0f0;border-top:1px solid #d1d1d1;border-right:1px solid #d1d1d1;border-bottom:1px solid #d1d1d1;border-left:1px solid #d1d1d1;height:40px;padding:5px 20px 5px 20px;font-size:1.8rem;font-weight:600;line-height:40px;color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:visited{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:hover{color:#7d7d7d;text-decoration:none}.example-sections-4>.item.title>.switch:active{color:#333;text-decoration:none}.example-sections-4>.item.title:not(.disabled)>.switch:focus,.example-sections-4>.item.title:not(.disabled)>.switch:hover{background:#fcfcfc}.example-sections-4>.item.title:not(.disabled)>.switch:active,.example-sections-4>.item.title.active>.switch,.example-sections-4>.item.title.active>.switch:focus,.example-sections-4>.item.title.active>.switch:hover{background:#fff;padding-bottom:5px}.example-sections-4>.item.content{background:#fff;border:1px solid #d1d1d1;margin:0 0 5px;padding:20px 20px 20px 20px}}.example-sections-5{position:relative;z-index:1}.example-sections-5:before,.example-sections-5:after{content:"";display:table}.example-sections-5:after{clear:both}.example-sections-5>.item.title{float:left;width:auto}.example-sections-5>.item.title>.switch{display:block;height:20px;position:relative;z-index:2}.example-sections-5>.item.content{box-sizing:border-box;float:right;margin-top:20px;margin-left:-100%;width:100%}.example-sections-5>.item.content:before,.example-sections-5>.item.content:after{content:"";display:table}.example-sections-5>.item.content:after{clear:both}.example-sections-5>.item.content.active{display:block}.example-sections-6{margin:0;padding:0}.example-sections-6>.item.title{box-sizing:border-box;float:none;width:100%}.example-sections-6>.item.title>.switch{display:block}.example-sections-6>.item.content{box-sizing:border-box;float:none;margin:0;display:block}.example-sections-6>.item.content:before,.example-sections-6>.item.content:after{content:"";display:table}.example-sections-6>.item.content:after{clear:both}.example-sections-6>.item.content.active{display:block}.example-table-1{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-1 th{text-align:left}.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{vertical-align:top}.example-table-1>thead>tr>th,.example-table-1>thead>tr>td{vertical-align:bottom}.example-table-1>thead>tr>th,.example-table-1>tbody>tr>th,.example-table-1>tfoot>tr>th,.example-table-1>thead>tr>td,.example-table-1>tbody>tr>td,.example-table-1>tfoot>tr>td{padding:8px 10px}.example-table-2>thead>tr>th,.example-table-2>tbody>tr>th,.example-table-2>tfoot>tr>th{color:#111;font-weight:700}.example-table-3{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-3 th{text-align:left}.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{vertical-align:top}.example-table-3>thead>tr>th,.example-table-3>thead>tr>td{vertical-align:bottom}.example-table-3>thead>tr>th,.example-table-3>tbody>tr>th,.example-table-3>tfoot>tr>th,.example-table-3>thead>tr>td,.example-table-3>tbody>tr>td,.example-table-3>tfoot>tr>td{padding:8px 10px}.example-table-3>caption{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-table-4{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-4 th{text-align:left}.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{vertical-align:top}.example-table-4>thead>tr>th,.example-table-4>thead>tr>td{vertical-align:bottom}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th,.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:8px 10px}.example-table-4>thead>tr>td,.example-table-4>tbody>tr>td,.example-table-4>tfoot>tr>td{padding:15px 25px 5px 0}.example-table-4>thead>tr>th,.example-table-4>tbody>tr>th,.example-table-4>tfoot>tr>th{padding:15px 25px 10px 0}.example-table-5{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;background:#fff}.example-table-5 th{text-align:left}.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{vertical-align:top}.example-table-5>thead>tr>th,.example-table-5>thead>tr>td{vertical-align:bottom}.example-table-5>thead>tr>th,.example-table-5>tbody>tr>th,.example-table-5>tfoot>tr>th,.example-table-5>thead>tr>td,.example-table-5>tbody>tr>td,.example-table-5>tfoot>tr>td{padding:8px 10px}.example-table-5>thead{background:#ccf}.example-table-5>tfoot{background:#cff}.example-table-5>tbody>tr>td{background:#fcc}.example-table-5>tbody>tr>th{background:#ffc}.example-table-6{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-6 th{text-align:left}.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{vertical-align:top}.example-table-6>thead>tr>th,.example-table-6>thead>tr>td{vertical-align:bottom}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{padding:8px 10px}.example-table-6>thead>tr>th,.example-table-6>tbody>tr>th,.example-table-6>tfoot>tr>th,.example-table-6>thead>tr>td,.example-table-6>tbody>tr>td,.example-table-6>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-7{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-7 th{text-align:left}.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{vertical-align:top}.example-table-7>thead>tr>th,.example-table-7>thead>tr>td{vertical-align:bottom}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{padding:8px 10px}.example-table-7>thead>tr>th,.example-table-7>tbody>tr>th,.example-table-7>tfoot>tr>th,.example-table-7>thead>tr>td,.example-table-7>tbody>tr>td,.example-table-7>tfoot>tr>td{border-top:1px solid #d1d1d1}.example-table-7>caption+thead>tr:first-child>th,.example-table-7>colgroup+thead>tr:first-child>th,.example-table-7>thead:first-child>tr:first-child>th,.example-table-7>caption+thead>tr:first-child>td,.example-table-7>colgroup+thead>tr:first-child>td,.example-table-7>thead:first-child>tr:first-child>td{border-top:0}.example-table-7>tbody+tbody{border-top:1px solid #d1d1d1}.example-table-8{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-8 th{text-align:left}.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{vertical-align:top}.example-table-8>thead>tr>th,.example-table-8>thead>tr>td{vertical-align:bottom}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{padding:8px 10px}.example-table-8>thead>tr>th,.example-table-8>tbody>tr>th,.example-table-8>tfoot>tr>th,.example-table-8>thead>tr>td,.example-table-8>tbody>tr>td,.example-table-8>tfoot>tr>td{border-left:1px solid #d1d1d1}.example-table-8>thead>tr>th:first-child,.example-table-8>tbody>tr>th:first-child,.example-table-8>tfoot>tr>th:first-child,.example-table-8>thead>tr>td:first-child,.example-table-8>tbody>tr>td:first-child,.example-table-8>tfoot>tr>td:first-child{border-left:0}.example-table-9{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-9 th{text-align:left}.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{vertical-align:top}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{vertical-align:bottom}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{padding:8px 10px}.example-table-9>thead>tr>th,.example-table-9>tbody>tr>th,.example-table-9>tfoot>tr>th,.example-table-9>thead>tr>td,.example-table-9>tbody>tr>td,.example-table-9>tfoot>tr>td{border:0}.example-table-9>thead>tr>th,.example-table-9>thead>tr>td{border-bottom:1px solid #d1d1d1}.example-table-10{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:0}.example-table-10 th{text-align:left}.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{vertical-align:top}.example-table-10>thead>tr>th,.example-table-10>thead>tr>td{vertical-align:bottom}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{padding:8px 10px}.example-table-10>thead>tr>th,.example-table-10>tbody>tr>th,.example-table-10>tfoot>tr>th,.example-table-10>thead>tr>td,.example-table-10>tbody>tr>td,.example-table-10>tfoot>tr>td{border:0}.example-table-11{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-11 th{text-align:left}.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{vertical-align:top}.example-table-11>thead>tr>th,.example-table-11>thead>tr>td{vertical-align:bottom}.example-table-11>thead>tr>th,.example-table-11>tbody>tr>th,.example-table-11>tfoot>tr>th,.example-table-11>thead>tr>td,.example-table-11>tbody>tr>td,.example-table-11>tfoot>tr>td{padding:8px 10px}.example-table-11>tbody>tr:nth-child(even)>td,.example-table-11>tbody>tr:nth-child(even)>th{background:#ffc;color:#000}.example-table-12{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%}.example-table-12 th{text-align:left}.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{vertical-align:top}.example-table-12>thead>tr>th,.example-table-12>thead>tr>td{vertical-align:bottom}.example-table-12>thead>tr>th,.example-table-12>tbody>tr>th,.example-table-12>tfoot>tr>th,.example-table-12>thead>tr>td,.example-table-12>tbody>tr>td,.example-table-12>tfoot>tr>td{padding:8px 10px}.example-table-12>tbody>tr:nth-child(even):hover>td,.example-table-12>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-12>tbody>tr:nth-child(odd):hover>td,.example-table-12>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}.example-table-13{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-13 th{text-align:left}.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{vertical-align:top}.example-table-13>thead>tr>th,.example-table-13>thead>tr>td{vertical-align:bottom}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{padding:8px 10px}.example-table-13>thead>tr>th,.example-table-13>tbody>tr>th,.example-table-13>tfoot>tr>th,.example-table-13>thead>tr>td,.example-table-13>tbody>tr>td,.example-table-13>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-13>tbody>tr:nth-child(odd)>td,.example-table-13>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-13>tbody>tr:nth-child(even):hover>td,.example-table-13>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-13>tbody>tr:nth-child(odd):hover>td,.example-table-13>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-14{ width:100%;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}}.example-table-15{border-collapse:collapse;border-spacing:0;max-width:100%;width:100%;border:1px solid #d1d1d1}.example-table-15 th{text-align:left}.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{vertical-align:top}.example-table-15>thead>tr>th,.example-table-15>thead>tr>td{vertical-align:bottom}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{padding:8px 10px}.example-table-15>thead>tr>th,.example-table-15>tbody>tr>th,.example-table-15>tfoot>tr>th,.example-table-15>thead>tr>td,.example-table-15>tbody>tr>td,.example-table-15>tfoot>tr>td{border:1px solid #d1d1d1}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#fff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#f0f0f0}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#f0f0f0}@media only screen and (max-width: 768px){.example-table-15{ border:0;display:block;background:#cff}.example-table-15>tbody>tr:nth-child(odd)>td,.example-table-15>tbody>tr:nth-child(odd)>th{background:#cff}.example-table-15>tbody>tr:nth-child(even):hover>td,.example-table-15>tbody>tr:nth-child(even):hover>th{background:#cff}.example-table-15>tbody>tr:nth-child(odd):hover>td,.example-table-15>tbody>tr:nth-child(odd):hover>th{background:#cff}.example-table-15>thead>tr>th{display:none}.example-table-15>tbody{display:block}.example-table-15>tbody>tr{display:block}.example-table-15>tbody>tr td,.example-table-15>tbody>tr th{border-bottom:0;display:block;padding:5px 0}.example-table-15>tbody>tr td:before,.example-table-15>tbody>tr th:before{content:attr(data-th) ":";display:inline-block;padding-right:10px;color:#111;font-weight:700}.example-table-15>tbody>tr td{background:#cff}.example-table-15>tbody>tr>th{background-color:#ffc!important}}.example-tooltip-bottom{position:relative}.example-tooltip-bottom .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;top:100%;left:0;margin-top:5px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-bottom .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-bottom .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-bottom .tooltip-content:after,.example-tooltip-bottom .tooltip-content:before{bottom:100%}.example-tooltip-bottom .tooltip-content:after{border-bottom-color:#fff;margin-left:-5px;left:15px}.example-tooltip-bottom .tooltip-content:before{border-bottom-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-bottom .tooltip-toggle{cursor:help}.example-tooltip-bottom .tooltip-toggle:hover+.tooltip-content,.example-tooltip-bottom .tooltip-toggle:focus+.tooltip-content,.example-tooltip-bottom:hover .tooltip-content{display:block}.example-tooltip-left{position:relative}.example-tooltip-left .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;right:100%;top:0;margin-right:5px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-left .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-left .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-left .tooltip-content:after,.example-tooltip-left .tooltip-content:before{left:100%}.example-tooltip-left .tooltip-content:after{border-left-color:#fff;margin-top:-5px;top:15px}.example-tooltip-left .tooltip-content:before{border-left-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-left .tooltip-toggle{cursor:help}.example-tooltip-left .tooltip-toggle:hover+.tooltip-content,.example-tooltip-left .tooltip-toggle:focus+.tooltip-content,.example-tooltip-left:hover .tooltip-content{display:block}.example-tooltip-right{position:relative}.example-tooltip-right .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;left:100%;top:0;margin-left:5px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-right .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-right .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-right .tooltip-content:after,.example-tooltip-right .tooltip-content:before{right:100%}.example-tooltip-right .tooltip-content:after{border-right-color:#fff;margin-top:-5px;top:15px}.example-tooltip-right .tooltip-content:before{border-right-color:#bbb;margin-top:-6px;top:15px}.example-tooltip-right .tooltip-toggle{cursor:help}.example-tooltip-right .tooltip-toggle:hover+.tooltip-content,.example-tooltip-right .tooltip-toggle:focus+.tooltip-content,.example-tooltip-right:hover .tooltip-content{display:block}.example-tooltip-top{position:relative}.example-tooltip-top .tooltip-content{z-index:100;background:#fff;min-width:210px;max-width:360px;padding:12px 16px;display:none;position:absolute;text-align:left;color:#333;line-height:1.4;border:1px solid #bbb;bottom:100%;left:0;margin-bottom:5px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{border:solid transparent;content:'';height:0;width:0;position:absolute}.example-tooltip-top .tooltip-content:after{border-color:transparent;border-width:5px}.example-tooltip-top .tooltip-content:before{border-color:transparent;border-width:6px}.example-tooltip-top .tooltip-content:after,.example-tooltip-top .tooltip-content:before{top:100%}.example-tooltip-top .tooltip-content:after{border-top-color:#fff;margin-left:-5px;left:15px}.example-tooltip-top .tooltip-content:before{border-top-color:#bbb;margin-left:-6px;left:15px}.example-tooltip-top .tooltip-toggle{cursor:help}.example-tooltip-top .tooltip-toggle:hover+.tooltip-content,.example-tooltip-top .tooltip-toggle:focus+.tooltip-content,.example-tooltip-top:hover .tooltip-content{display:block}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example{font-size:2.5rem}.example-line-height{line-height:3rem}.example-word-wrap{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto;background:#ccc;width:120px}.example-text-overflow{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#ccc;width:120px}.example-text-hide{background-color:transparent;border:0;font:0/0 a;color:transparent;text-shadow:none}.example-hyphens{word-wrap:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.example-hyphens-none{word-wrap:break-word;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.example-typography{font-size:3rem;color:#fc0;font-family:Menlo,Monaco,Consolas,'Courier New',monospace;font-weight:500;font-style:italic;line-height:1.2}.example-list-reset-styles{margin:0;padding:0;list-style:none none}.example-list-inline{margin:0;padding:0;list-style:none none}.example-list-inline>li{display:inline-block;vertical-align:top}.example-link-default{color:#1979c3;text-decoration:none}.example-link-default:visited{color:#1979c3;text-decoration:none}.example-link-default:hover{color:#006bb4;text-decoration:underline}.example-link-default:active{color:#ff5501;text-decoration:underline}.example-link{color:#008000;text-decoration:none}.example-link:visited{color:#1979c3;text-decoration:none}.example-link:hover{color:#ffa500;text-decoration:none}.example-link:active{color:#ff5501;text-decoration:underline}.example-heading{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}.example-heading-2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}html{font-size:62.5%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;font-size-adjust:100%}body{font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.42857143}p{margin-top:0rem;margin-bottom:1rem}abbr[title]{cursor:help;border-bottom:1px dotted #d1d1d1}b,strong{font-weight:700}em,i{font-style:italic}mark{background:#f0f0f0;color:#000}small,.small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #d1d1d1}sub,sup{font-size:71.42857143%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dfn{font-style:italic}h1{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:0rem;margin-bottom:2rem}h2{font-size:2.6rem;font-weight:300;line-height:1.1;margin-top:2.5rem;margin-bottom:2rem}h3{font-size:1.8rem;font-weight:300;line-height:1.1;margin-top:1.5rem;margin-bottom:1rem}h4{font-size:1.4rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h5{font-size:1.2rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h6{font-size:1rem;font-weight:700;line-height:1.1;margin-top:2rem;margin-bottom:2rem}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small{color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1}a,.alink{color:#1979c3;text-decoration:none}a:visited,.alink:visited{color:#1979c3;text-decoration:none}a:hover,.alink:hover{color:#006bb4;text-decoration:underline}a:active,.alink:active{color:#ff5501;text-decoration:underline}ul,ol{margin-top:0rem;margin-bottom:2.5rem}ul>li,ol>li{margin-top:0rem;margin-bottom:1rem}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}dl{margin-top:0;margin-bottom:20px}dt{font-weight:700;margin-top:0;margin-bottom:5px}dd{margin-top:0;margin-bottom:10px;margin-left:0}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px;white-space:nowrap}kbd{background:#f0f0f0;color:#111;font-size:1.2rem;padding:2px 4px}pre{background:#f0f0f0;border:1px solid #d1d1d1;color:#111;display:block;font-size:1.2rem;margin:0 0 10px;line-height:1.42857143;padding:10px;word-wrap:break-word}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}blockquote{border-left:0 solid #d1d1d1;margin:0 0 20px 40px;padding:0;font-size:1.4rem;color:#333;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;font-style:italic;line-height:1.42857143}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{color:#333;display:block;font-size:1rem;line-height:1.42857143}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote cite{font-style:normal}blockquote:before,blockquote:after{content:""}q{quotes:none}q:before,q:after{content:'';content:none}cite{font-style:normal}.example-clearfix-container-1{border:1px solid red}.example-clearfix-container-2{border:1px solid #0f0}.example-clearfix-container-2:before,.example-clearfix-container-2:after{content:"";display:table}.example-clearfix-container-2:after{clear:both}.example-clearfix-item.left{float:left}.example-clearfix-item.right{float:right}.example-visibility-hidden{height:0;visibility:hidden}.example-visually-hidden-1{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{background:#fdf0d5;padding:5px;border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.example-visually-hidden-2{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.example-css-container{padding:20px;background:#e8e8e8}.example-rotate{background:red;position:absolute;height:20px;width:40px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.example-placeholder::-webkit-input-placeholder{color:#808080;font-weight:700}.example-placeholder:-moz-placeholder{color:#808080;font-weight:700}.example-placeholder::-moz-placeholder{color:#808080;font-weight:700}.example-placeholder:-ms-input-placeholder{color:#808080;font-weight:700}.example-background-gradient-1{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top, #cff 0, #ccf 100%);background-image:linear-gradient(to bottom, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=0)}.example-background-gradient-2{background-color:#ccf;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop( #cff 0),color-stop( #ccf 100%));background-image:linear-gradient(to right, #cff 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ccffff', endColorstr='#ccccff', GradientType=1)}.example-background-gradient-3-wrapper{background:#ffc;padding:10px}.example-background-gradient-3{background-color:rgba(255,255,255,0);background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(rgba(255,255,255,0) 0),color-stop( #ccf 100%));background-image:linear-gradient(to right,rgba(255,255,255,0) 0, #ccf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='rgba(255, 255, 255, 0)',endColorstr='#ccccff',GradientType=1)}body{padding:15px;background-image:none}</style></head><body><nav class="bar top cf"><div class="container"><a href="index.html" class="brand">Magento UI Library</a><ul class="menu"><li><a href="#" data-toggle="dropdown-1" unselectable="on" class="dropdown-toggle">files</a><ul id="dropdown-1" hidden class="dropdown"><li><a href="actions-toolbar.html">actions-toolbar</a></li><li><a href="breadcrumbs.html">breadcrumbs</a></li><li><a href="buttons.html">buttons</a></li><li><a href="docs.html">docs</a></li><li><a href="dropdowns.html">dropdowns</a></li><li><a href="forms.html">forms</a></li><li><a href="icons.html">icons</a></li><li><a href="layout.html">layout</a></li><li><a href="lib.html">lib</a></li><li><a href="loaders.html">loaders</a></li><li><a href="messages.html">messages</a></li><li><a href="pages.html">pages</a></li><li><a href="popups.html">popups</a></li><li><a href="rating.html">rating</a></li><li><a href="resets.html">resets</a></li><li><a href="responsive.html">responsive</a></li><li><a href="sections.html">sections</a></li><li><a href="tables.html">tables</a></li><li><a href="tooltips.html">tooltips</a></li><li><a href="typography.html">typography</a></li><li><a href="utilities.html">utilities</a></li><li><a href="variables.html">variables</a></li></ul></li></ul><div class="nav"><button title="Table of Contents" data-toggle="nav-toc"><svg viewBox="0 0 512 512" height="22" width="22" class="icon"><path d="M108.9,403.1V462H50v-58.9H108.9z M108.9,285.4H50v58.9h58.9V285.4zM108.9,50H50v58.9h58.9V50z M108.9,167.7H50v58.9h58.9V167.7z M167.7,344.3H462v-58.9H167.7V344.3zM167.7,50v58.9H462V50H167.7z M167.7,462H462v-58.9H167.7V462z M167.7,226.6H462v-58.9H167.7V226.6z"></path></svg></button><input type="search" placeholder="Search" class="search"></div></div></nav><section class="container"><article id="icons" class="section"><div class="docs"><a href="#icons" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icons">Icons</h1> <p> Icons can be represented by using the fonts, images, or sprites.</p> <p> An icon can be added to any HTML tag. For this purpose you need to use additional <code><span></code> tag within your tag. This additional tag serves for displaying an icon without visible text, thus following the <strong>accessibility requirements</strong>. Then you need to apply appropriate <code>icon</code> mixin for this tag's class. Icon can be added both before and after element's text. Also, icon can be displayed instead of element's text (in this case the text is hidden).</p> <p> There are two ways to insert icon: first you can use <strong>sprite or image</strong>, second you can use <strong>an icon font</strong>. Magento UI library provides mixins for both of them.</p> @@ -21,59 +21,55 @@ <a href="#" class="example-icon-5"><span>font icon after the text</span></a> <br> <a href="#" class="example-icon-6" title="font icon instead of the text"><span>icon instead of the text</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-1 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); -} - -.example-icon-2 { - .icon-image( - @_icon-image: '@{baseDir}images/blank-theme-icons.png', - @_icon-image-position-x: -26px, - @_icon-image-position-y: 0, - @_icon-image-position: after - ); -} - -.example-icon-3 { - .icon-image( - @_icon-image: '@{baseDir}images/blank-theme-icons.png', - @_icon-image-position-x: -156px, - @_icon-image-position-y: -52px, - @_icon-image-text-hide: true - ); -} - -.example-icon-4 { - .icon-font( - @_icon-font-content: @icon-settings, - @_icon-font-size: 24px - ); -} - -.example-icon-5 { - .icon-font( - @_icon-font-content: @icon-star, - @_icon-font-size: 24px, - @_icon-font-position: after - ); -} - -.example-icon-6 { - .icon-font( - @_icon-font-content: @icon-flag, - @_icon-font-size: 24px, - @_icon-font-text-hide: true - ); -} - </code></pre></div></article><article id="icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite">Icon with image or sprite</h1> +</div><div class="code"><pre><code>.example-icon-1 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); +} + +.example-icon-2 { + .icon-image( + @_icon-image: '@{baseDir}images/blank-theme-icons.png', + @_icon-image-position-x: -26px, + @_icon-image-position-y: 0, + @_icon-image-position: after + ); +} + +.example-icon-3 { + .icon-image( + @_icon-image: '@{baseDir}images/blank-theme-icons.png', + @_icon-image-position-x: -156px, + @_icon-image-position-y: -52px, + @_icon-image-text-hide: true + ); +} + +.example-icon-4 { + .icon-font( + @_icon-font-content: @icon-settings, + @_icon-font-size: 24px + ); +} + +.example-icon-5 { + .icon-font( + @_icon-font-content: @icon-star, + @_icon-font-size: 24px, + @_icon-font-position: after + ); +} + +.example-icon-6 { + .icon-font( + @_icon-font-content: @icon-flag, + @_icon-font-size: 24px, + @_icon-font-text-hide: true + ); +}</code></pre></div></article><article id="icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite">Icon with image or sprite</h1> <p> the <code>.icon-image()</code> mixin is used to create icons using single image or sprite. It has one mandatory parameter - <code>@_icon-image</code>. This parameter accepts the path to an image or sprite.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-7"><span>icon-search</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-7 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); -} - </code></pre></div></article><article id="icon-with-image-or-sprite-variables" class="section"><div class="docs"><a href="#icon-with-image-or-sprite-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite-variables">Icon with image or sprite variables</h1> +</div><div class="code"><pre><code>.example-icon-7 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); +}</code></pre></div></article><article id="icon-with-image-or-sprite-variables" class="section"><div class="docs"><a href="#icon-with-image-or-sprite-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-with-image-or-sprite-variables">Icon with image or sprite variables</h1> <pre> <table> <tr> @@ -138,28 +134,26 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="icon-position-for-an-icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-position-for-an-icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-position-for-an-icon-with-image-or-sprite">Icon position for an icon with image or sprite</h1> +</div></article><article id="icon-position-for-an-icon-with-image-or-sprite" class="section"><div class="docs"><a href="#icon-position-for-an-icon-with-image-or-sprite" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-position-for-an-icon-with-image-or-sprite">Icon position for an icon with image or sprite</h1> <p> To change the position for icons with image the <code>.icon-image-position()</code> mixin is used. By managing its <code>@_icon-image-position-x</code> and <code>@_icon-image-position-y</code> variables you can move the image on element's background. The <code>@_icon-image-position</code> variable is used to define the position of icon (before or after the element).</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-8"><span>icon-star</span></a> <br> <a href="#" class="example-icon-9"><span>icon-heart</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-8 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-image-position( - @_icon-image-position-x: -182px - ); -} - -.example-icon-9 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png', @_icon-image-position: after); - .icon-image-position( - @_icon-image-position-x: -52px, - @_icon-image-position-y: -26px, - @_icon-image-position: after - ); -} - </code></pre></div></article><article id="position-for-icon-with-image-or-sprite-mixin-variables" class="section"><div class="docs"><a href="#position-for-icon-with-image-or-sprite-mixin-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="position-for-icon-with-image-or-sprite-mixin-variables">Position for icon with image or sprite mixin variables</h1> +</div><div class="code"><pre><code>.example-icon-8 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-image-position( + @_icon-image-position-x: -182px + ); +} + +.example-icon-9 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png', @_icon-image-position: after); + .icon-image-position( + @_icon-image-position-x: -52px, + @_icon-image-position-y: -26px, + @_icon-image-position: after + ); +}</code></pre></div></article><article id="position-for-icon-with-image-or-sprite-mixin-variables" class="section"><div class="docs"><a href="#position-for-icon-with-image-or-sprite-mixin-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="position-for-icon-with-image-or-sprite-mixin-variables">Position for icon with image or sprite mixin variables</h1> <pre> <table> <tr> @@ -188,15 +182,13 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="icon-sprite-position-with-grid" class="section"><div class="docs"><a href="#icon-sprite-position-with-grid" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-with-grid">Icon sprite position (with grid)</h1> +</div></article><article id="icon-sprite-position-with-grid" class="section"><div class="docs"><a href="#icon-sprite-position-with-grid" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-with-grid">Icon sprite position (with grid)</h1> <p> Mixin <code>.icon-sprite-position()</code> is used to manage the position of sprite background image. It assumes the use of a single sprite image with individual images <strong>placed on a regular grid</strong>.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-10"><span>icon text</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-10 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-sprite-position(4, 0); -} - </code></pre></div></article><article id="icon-sprite-position-variables" class="section"><div class="docs"><a href="#icon-sprite-position-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-variables">Icon sprite position variables</h1> +</div><div class="code"><pre><code>.example-icon-10 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-sprite-position(4, 0); +}</code></pre></div></article><article id="icon-sprite-position-variables" class="section"><div class="docs"><a href="#icon-sprite-position-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="icon-sprite-position-variables">Icon sprite position variables</h1> <pre> <table> <tr> @@ -231,18 +223,16 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="imagesprite-icon-size" class="section"><div class="docs"><a href="#imagesprite-icon-size" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size">Image/sprite icon size</h1> +</div></article><article id="imagesprite-icon-size" class="section"><div class="docs"><a href="#imagesprite-icon-size" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size">Image/sprite icon size</h1> <p> Mixin <code>.icon-image-size()</code> is used to change the image/sprite icon size</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-11"><span>icon-search</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-11 { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - .icon-image-size(30px, 30px); - &:before { - background-color: #f1f1f1; - } -} - </code></pre></div></article><article id="imagesprite-icon-size-variables" class="section"><div class="docs"><a href="#imagesprite-icon-size-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size-variables">Image/sprite icon size variables</h1> +</div><div class="code"><pre><code>.example-icon-11 { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + .icon-image-size(30px, 30px); + &:before { + background-color: #f1f1f1; + } +}</code></pre></div></article><article id="imagesprite-icon-size-variables" class="section"><div class="docs"><a href="#imagesprite-icon-size-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="imagesprite-icon-size-variables">Image/sprite icon size variables</h1> <pre> <table> <tr> @@ -274,14 +264,12 @@ </div></article><article id="font-icon" class="section"><div class="docs"><a href="#font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon">Font icon</h1> <p> The <code>.icon-font()</code> mixin is used to create icons using font icons. It has one mandatory parameter - <code>@_icon-font-content</code>. This parameter accepts the font icon code.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-12"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-12 { - .icon-font( - @icon-calendar, - @_icon-font-size: 28px - ); -} - </code></pre></div></article><article id="font-icon-variables" class="section"><div class="docs"><a href="#font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon-variables">Font icon variables</h1> +</div><div class="code"><pre><code>.example-icon-12 { + .icon-font( + @icon-calendar, + @_icon-font-size: 28px + ); +}</code></pre></div></article><article id="font-icon-variables" class="section"><div class="docs"><a href="#font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="font-icon-variables">Font icon variables</h1> <pre> <table> <tr> @@ -364,17 +352,15 @@ </tr> </table> </pre> -</div><div class="code"><pre><code> </code></pre></div></article><article id="change-the-size-of-font-icon" class="section"><div class="docs"><a href="#change-the-size-of-font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon">Change the size of font icon</h1> +</div></article><article id="change-the-size-of-font-icon" class="section"><div class="docs"><a href="#change-the-size-of-font-icon" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon">Change the size of font icon</h1> <p> The <code>.icon-font-size()</code> mixin is used to change size of the font icon which is already defined. The mixin generates only new font size and line height without any other options. @_icon-font-position variable is used to define the position of icon (before or after the element) which we want to set font size of.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-13"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-13 { - .icon-font(@icon-calendar); - .icon-font-size( - @_icon-font-size: 26px - ); -} - </code></pre></div></article><article id="change-the-size-of-font-icon-variables" class="section"><div class="docs"><a href="#change-the-size-of-font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon-variables">Change the size of font icon variables</h1> +</div><div class="code"><pre><code>.example-icon-13 { + .icon-font(@icon-calendar); + .icon-font-size( + @_icon-font-size: 26px + ); +}</code></pre></div></article><article id="change-the-size-of-font-icon-variables" class="section"><div class="docs"><a href="#change-the-size-of-font-icon-variables" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="change-the-size-of-font-icon-variables">Change the size of font icon variables</h1> <pre> <table> <tr> @@ -406,15 +392,13 @@ </div></article><article id="hide-icon-text" class="section"><div class="docs"><a href="#hide-icon-text" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="hide-icon-text">Hide icon text</h1> <p> The <code>.icon-text-hide()</code> mixin can be used separately to hide text of an element that has an icon text. This mixin accepts no variables.</p> <textarea class="preview-code" spellcheck="false"> <a href="#" class="example-icon-14"><span>icon-calendar</span></a></textarea> -</div><div class="code"><pre><code> -.example-icon-14 { - .icon-font( - @icon-envelope, - @_icon-font-size: 26px - ); - .icon-text-hide(); -} - </code></pre></div></article><article id="sprite-and-font-icons-for-blank-theme" class="section"><div class="docs"><a href="#sprite-and-font-icons-for-blank-theme" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="sprite-and-font-icons-for-blank-theme">Sprite and font icons for Blank theme</h1> +</div><div class="code"><pre><code>.example-icon-14 { + .icon-font( + @icon-envelope, + @_icon-font-size: 26px + ); + .icon-text-hide(); +}</code></pre></div></article><article id="sprite-and-font-icons-for-blank-theme" class="section"><div class="docs"><a href="#sprite-and-font-icons-for-blank-theme" class="permalink"><svg viewBox="0 0 512 512" height="32" width="32" class="icon"><path d="M156.2,199.7c7.5-7.5,15.9-13.8,24.8-18.7c49.6-27.3,113.1-12.8,145,35.5l-38.5,38.5c-11.1-25.2-38.5-39.6-65.8-33.5c-10.3,2.3-20.1,7.4-28,15.4l-73.9,73.9c-22.4,22.4-22.4,58.9,0,81.4c22.4,22.4,58.9,22.4,81.4,0l22.8-22.8c20.7,8.2,42.9,11.5,64.9,9.9l-50.3,50.3c-43.1,43.1-113,43.1-156.1,0c-43.1-43.1-43.1-113-0-156.1L156.2,199.7z M273.6,82.3l-50.3,50.3c21.9-1.6,44.2,1.6,64.9,9.9l22.8-22.8c22.4-22.4,58.9-22.4,81.4,0c22.4,22.4,22.4,58.9,0,81.4l-73.9,73.9c-22.5,22.5-59.1,22.3-81.4,0c-5.2-5.2-9.7-11.7-12.5-18l-38.5,38.5c4,6.1,8.3,11.5,13.7,16.9c13.9,13.9,31.7,24.3,52.1,29.3c26.5,6.4,54.8,2.8,79.2-10.6c8.9-4.9,17.3-11.1,24.8-18.7l73.9-73.9c43.1-43.1,43.1-113,0-156.1C386.6,39.2,316.7,39.2,273.6,82.3z"></path></svg></a><h1 id="sprite-and-font-icons-for-blank-theme">Sprite and font icons for Blank theme</h1> <p> You can use the icons designed to our Blank theme, which are also available in two variants: sprite and font</p> <h2 id="icons-using-sprite">Icons using sprite</h2> <textarea class="preview-code" spellcheck="false"> <ul class="icons-image-list"> @@ -642,180 +626,185 @@ <li> <span class="icon-arrow-down-thin" data-icon=""><span>@icon-arrow-down-thin</span></span> </li> + <li> + <span class="icon-arrow-left-thin" data-icon=""><span>@icon-gift-registry</span></span> + </li> + <li> + <span class="icon-arrow-down-thin" data-icon=""><span>@icon-present</span></span> + </li> </ul></textarea> -</div><div class="code"><pre><code> -.icons-image-list { - list-style: none; - padding: 0; - li { - float: left; - width: 33%; - > span { - .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); - } - .icon-search { - .icon-sprite-position(0, 0); - } - .icon-cart { - .icon-sprite-position(1, 0); - } - .icon-arrow-down { - .icon-sprite-position(2, 0); - } - .icon-arrow-up { - .icon-sprite-position(3, 0); - } - .icon-grid { - .icon-sprite-position(4, 0); - } - .icon-list { - .icon-sprite-position(5, 0); - } - .icon-remove { - .icon-sprite-position(6, 0); - } - .icon-star { - .icon-sprite-position(7, 0); - } - .icon-pointer-down { - .icon-sprite-position(8, 0); - } - .icon-pointer-up { - .icon-sprite-position(9, 0); - } - .icon-pointer-left { - .icon-sprite-position(10, 0); - } - .icon-pointer-right { - .icon-sprite-position(11, 0); - } - .icon-compare-empty { - .icon-sprite-position(0, 1); - } - .icon-compare-full { - .icon-sprite-position(1, 1); - } - .icon-wishlist-empty { - .icon-sprite-position(2, 1); - } - .icon-wishlist-full { - .icon-sprite-position(3, 1); - } - .icon-update { - .icon-sprite-position(4, 1); - } - .icon-collapse { - .icon-sprite-position(5, 1); - } - .icon-expand { - .icon-sprite-position(6, 1); - } - .icon-menu { - .icon-sprite-position(7, 1); - } - .icon-prev { - .icon-sprite-position(8, 1); - } - .icon-next { - .icon-sprite-position(9, 1); - } - .icon-settings { - .icon-sprite-position(10, 1); - } - .icon-info { - .icon-sprite-position(11, 1); - } - .icon-checkmark { - .icon-sprite-position(0, 2); - } - .icon-calendar { - .icon-sprite-position(1, 2); - } - .icon-comment { - .icon-sprite-position(2, 2); - } - .icon-comment-reflected { - .icon-sprite-position(3, 2); - } - .icon-envelope { - .icon-sprite-position(4, 2); - } - .icon-warning { - .icon-sprite-position(5, 2); - } - .icon-trash { - .icon-sprite-position(6, 2); - } - .icon-flag { - .icon-sprite-position(7, 2); - } - .icon-location { - .icon-sprite-position(8, 2); - } - .icon-up { - .icon-sprite-position(9, 2); - } - .icon-down { - .icon-sprite-position(10, 2); - } - } -} - -@icon-wishlist-full: '\e600'; -@icon-wishlist-empty: '\e601'; -@icon-warning: '\e602'; -@icon-update: '\e603'; -@icon-trash: '\e604'; -@icon-star: '\e605'; -@icon-settings: '\e606'; -@icon-pointer-down: '\e607'; -@icon-next: '\e608'; -@icon-menu: '\e609'; -@icon-location: '\e60a'; -@icon-list: '\e60b'; -@icon-info: '\e60c'; -@icon-grid: '\e60d'; -@icon-comment-reflected: '\e60e'; -@icon-collapse: '\e60f'; -@icon-checkmark: '\e610'; -@icon-cart: '\e611'; -@icon-calendar: '\e612'; -@icon-arrow-up: '\e613'; -@icon-arrow-down: '\e614'; -@icon-search: '\e615'; -@icon-remove: '\e616'; -@icon-prev: '\e617'; -@icon-pointer-up: '\e618'; -@icon-pointer-right: '\e619'; -@icon-pointer-left: '\e61a'; -@icon-flag: '\e61b'; -@icon-expand: '\e61c'; -@icon-envelope: '\e61d'; -@icon-compare-full: '\e61e'; -@icon-compare-empty: '\e61f'; -@icon-comment: '\e620'; -@icon-up: '\e621'; -@icon-down: '\e622'; -@icon-arrow-up-thin: '\e623'; -@icon-arrow-right-thin: '\e624'; -@icon-arrow-left-thin: '\e625'; -@icon-arrow-down-thin: '\e626'; - -.icons-font-list { - list-style: none; - padding: 0; - li { - float: left; - width: 25%; - margin-bottom: 35px; - text-align: center; - > span { - .icon-font('', @_icon-font-size: 34px); - &:before { - content: attr(data-icon); - margin: 0 auto; - display: block; - } - } - } -} </code></pre></div></article></section><div class="bar bottom"><div hidden class="settings container"><!-- Icons from http://iconmonstr.com--><button title="Desktop (1280)" data-width='1280'><svg viewBox="0 0 412 386" height="24" width="26" class="icon"><path d="m147.6,343.9c-4.5,15.9-26.2,37.6-42.1,42.1h201c-15.3,-4-38.1,-26.8-42.1,-42.1H147.6zM387,0.5H25c-13.8,0-25,11.2-25,25V294c0,13.8 11.2,25 25,25h362c13.8,0 25,-11.2 25,-25V25.5C412,11.7 400.8,0.5 387,0.5zM369.9,238.2H42.1L42.1,42.6 369.9,42.6V238.2z"></path></svg></button><button title="Laptop (1024)" data-width='1024'><svg viewBox="0 0 384 312" height="23" width="28" class="icon"><path d="m349.2,20.5c0,-11-9,-20-20,-20H53.6c-11,0-20,9-20,20v194H349.2v-194zm-27,167H60.6V27.5H322.2v160zm28,42H32.6L2.6,282.1c-3.5,6.2-3.5,13.8 0.1,19.9 3.6,6.2 10.2,9.9 17.3,9.9H363.1c7.1,0 13.7,-3.8 17.3,-10 3.6,-6.2 3.6,-13.8 0,-20l-30.2,-52.5zm-196.9,54 8,-23.5h60.5l8,23.5h-76.5z"></path></svg></button><button title="Tablet (768)" data-width='768'><svg viewBox="0 0 317 412" height="24" width="18" class="icon"><path d="M 316.5,380 V 32 c 0,-17.7 -14.3,-32 -32,-32 H 32 C 14.3,0 0,14.3 0,32 v 348 c 0,17.7 14.3,32 32,32 h 252.5 c 17.7,0 32,-14.3 32,-32 z M 40,367 V 45 H 276.5 V 367 H 40 z m 109.8,22.7 c 0,-4.7 3.8,-8.5 8.5,-8.5 4.7,0 8.5,3.8 8.5,8.5 0,4.7 -3.8,8.5 -8.5,8.5 -4.7,0 -8.5,-3.8 -8.5,-8.5 z"></path></svg></button><button title="Smart phone (320)" data-width='320'><svg viewBox="0 0 224 412" height="24" width="13" class="icon"><path d="M 190.7,0 H 33 C 14.8,0 0,14.8 0,33 v 346 c 0,18.2 14.8,33 33,33 h 157.7 c 18.2,0 33,-14.8 33,-33 V 33 c 0,-18.2 -14.8,-33 -33,-33 z M 94.3,30.2 h 37 c 2.2,0 4,1.8 4,4 0,2.2 -1.8,4 -4,4 h -37 c -2.2,0 -4,-1.8 -4,-4 0,-2.2 1.8,-4 4,-4 z m 18.5,362.8 c -8.8,0 -16,-7.2 -16,-16 0,-8.8 7.2,-16 16,-16 8.8,0 16,7.2 16,16 0,8.8 -7.2,16 -16,16 z M 198.6,343.8 H 25.1 V 68.2 h 173.5 v 275.5 z"></path></svg></button><button title="Feature phone (240)" data-width='240'><svg viewBox="0 0 201 412" height="24" width="12" class="icon"><path d="M 165.5,0.2 V 45 H 25 c -13.8,0 -25,11.2 -25,25 V 387 c 0,13.8 11.2,25 25,25 h 150.5 c 13.8,0 25,-11.2 25,-25 V 0.2 h -35 z M 65.2,366.5 H 34.2 v -24.5 h 31 v 24.5 z m 0,-44.3 H 34.2 v -24.5 h 31 v 24.5 z m 50.5,44.3 H 84.7 v -24.5 h 31 v 24.5 z m 0,-44.3 H 84.7 v -24.5 h 31 v 24.5 z m 50.5,44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-59.3 h -132 V 95.4 h 132 V 262.9 z"></path></svg></button><button title="Auto (100%)" data-width="auto" class="auto is-active">Auto</button></div></div><script>(function(){var a=[{title:"actions-toolbar",filename:"actions-toolbar",url:"actions-toolbar.html"},{title:"Actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar"},{title:"Actions toolbar mixin variables",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-mixin-variables"},{title:"Actions toolbar alignment",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-alignment"},{title:"Reverse primary and secondary blocks",filename:"actions-toolbar",url:"actions-toolbar.html#reverse-primary-and-secondary-blocks"},{title:"Actions toolbar indents customizations",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-indents-customizations"},{title:"Responsive actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#responsive-actions-toolbar"},{title:"breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html"},{title:"Breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs"},{title:"Breadcrumbs variables",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-variables"},{title:"Button-styled breadcrumbs with gradient background, border, and no separating symbol",filename:"breadcrumbs",url:"breadcrumbs.html#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol"},{title:"Breadcrumbs with solid background",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-with-solid-background"},{title:"buttons",filename:"buttons",url:"buttons.html"},{title:"Default button",filename:"buttons",url:"buttons.html#default-button"},{title:"Button variables",filename:"buttons",url:"buttons.html#button-variables"},{title:"Button as an icon",filename:"buttons",url:"buttons.html#button-as-an-icon"},{title:"Button with an icon on the left or right side of the text",filename:"buttons",url:"buttons.html#button-with-an-icon-on-the-left-or-right-side-of-the-text"},{title:"Button with fixed width",filename:"buttons",url:"buttons.html#button-with-fixed-width"},{title:"Primary button",filename:"buttons",url:"buttons.html#primary-button"},{title:"Primary button variables",filename:"buttons",url:"buttons.html#primary-button-variables"},{title:"Button with gradient background",filename:"buttons",url:"buttons.html#button-with-gradient-background"},{title:"Button as a link",filename:"buttons",url:"buttons.html#button-as-a-link"},{title:"Link as a button",filename:"buttons",url:"buttons.html#link-as-a-button"},{title:"Button reset",filename:"buttons",url:"buttons.html#button-reset"},{title:"Button revert secondary color",filename:"buttons",url:"buttons.html#button-revert-secondary-color"},{title:"Button revert secondary color variables",filename:"buttons",url:"buttons.html#button-revert-secondary-color-variables"},{title:"Button revert secondary size",filename:"buttons",url:"buttons.html#button-revert-secondary-size"},{title:"Button revert secondary size variables",filename:"buttons",url:"buttons.html#button-revert-secondary-size-variables"},{title:"docs",filename:"docs",url:"docs.html"},{title:"Documentation",filename:"docs",url:"docs.html#documentation"},{title:"dropdowns",filename:"dropdowns",url:"dropdowns.html"},{title:"Drop-down and split buttons mixins",filename:"dropdowns",url:"dropdowns.html#dropdown-and-split-buttons-mixins"},{title:"Drop-down",filename:"dropdowns",url:"dropdowns.html#dropdown"},{title:"Drop-down variables",filename:"dropdowns",url:"dropdowns.html#dropdown-variables"},{title:"Drop-down with icon customization",filename:"dropdowns",url:"dropdowns.html#dropdown-with-icon-customization"},{title:"Modify dropdown list styles",filename:"dropdowns",url:"dropdowns.html#modify-dropdown-list-styles"},{title:"Split button",filename:"dropdowns",url:"dropdowns.html#split-button"},{title:"Split button variables",filename:"dropdowns",url:"dropdowns.html#split-button-variables"},{title:"Split button - button styling",filename:"dropdowns",url:"dropdowns.html#split-button-button-styling"},{title:"Split button icon customization",filename:"dropdowns",url:"dropdowns.html#split-button-icon-customization"},{title:"Split button drop-down list customization",filename:"dropdowns",url:"dropdowns.html#split-button-dropdown-list-customization"},{title:"forms",filename:"forms",url:"forms.html"},{title:"Forms mixins",filename:"forms",url:"forms.html#forms-mixins"},{title:"Global forms elements customization",filename:"forms",url:"forms.html#global-forms-elements-customization"},{title:"Fieldsets & fields customization",filename:"forms",url:"forms.html#fieldsets-fields-customization"},{title:"Fieldset and legend customization variables",filename:"forms",url:"forms.html#fieldset-and-legend-customization-variables"},{title:"Fields customization variables",filename:"forms",url:"forms.html#fields-customization-variables"},{title:"Required fields message customization variables",filename:"forms",url:"forms.html#required-fields-message-customization-variables"},{title:"Form element inputs customization",filename:"forms",url:"forms.html#form-element-inputs-customization"},{title:"Form element inputs customization variables",filename:"forms",url:"forms.html#form-element-inputs-customization-variables"},{title:"Form element choice",filename:"forms",url:"forms.html#form-element-choice"},{title:"Form element choice variables",filename:"forms",url:"forms.html#form-element-choice-variables"},{title:"Custom color",filename:"forms",url:"forms.html#custom-color"},{title:"Input number - input-text view",filename:"forms",url:"forms.html#input-number-inputtext-view"},{title:"Input search - input-text view",filename:"forms",url:"forms.html#input-search-inputtext-view"},{title:"Form validation",filename:"forms",url:"forms.html#form-validation"},{title:"Form validation variables// <pre>",filename:"forms",url:"forms.html#form-validation-variables-pre"},{title:"icons",filename:"icons",url:"icons.html"},{title:"Icons",filename:"icons",url:"icons.html#icons"},{title:"Icon with image or sprite",filename:"icons",url:"icons.html#icon-with-image-or-sprite"},{title:"Icon with image or sprite variables",filename:"icons",url:"icons.html#icon-with-image-or-sprite-variables"},{title:"Icon position for an icon with image or sprite",filename:"icons",url:"icons.html#icon-position-for-an-icon-with-image-or-sprite"},{title:"Position for icon with image or sprite mixin variables",filename:"icons",url:"icons.html#position-for-icon-with-image-or-sprite-mixin-variables"},{title:"Icon sprite position (with grid)",filename:"icons",url:"icons.html#icon-sprite-position-with-grid"},{title:"Icon sprite position variables",filename:"icons",url:"icons.html#icon-sprite-position-variables"},{title:"Image/sprite icon size",filename:"icons",url:"icons.html#imagesprite-icon-size"},{title:"Image/sprite icon size variables",filename:"icons",url:"icons.html#imagesprite-icon-size-variables"},{title:"Font icon",filename:"icons",url:"icons.html#font-icon"},{title:"Font icon variables",filename:"icons",url:"icons.html#font-icon-variables"},{title:"Change the size of font icon",filename:"icons",url:"icons.html#change-the-size-of-font-icon"},{title:"Change the size of font icon variables",filename:"icons",url:"icons.html#change-the-size-of-font-icon-variables"},{title:"Hide icon text",filename:"icons",url:"icons.html#hide-icon-text"},{title:"Sprite and font icons for Blank theme",filename:"icons",url:"icons.html#sprite-and-font-icons-for-blank-theme"},{title:"layout",filename:"layout",url:"layout.html"},{title:"Layout",filename:"layout",url:"layout.html#layout"},{title:"Layout global variables",filename:"layout",url:"layout.html#layout-global-variables"},{title:"Page layouts",filename:"layout",url:"layout.html#page-layouts"},{title:"Layout column",filename:"layout",url:"layout.html#layout-column"},{title:"Layout column variables",filename:"layout",url:"layout.html#layout-column-variables"},{title:"Layout width",filename:"layout",url:"layout.html#layout-width"},{title:"Layout width variables",filename:"layout",url:"layout.html#layout-width-variables"},{title:"lib",filename:"lib",url:"lib.html"},{title:"Including Magento UI library to your theme",filename:"lib",url:"lib.html#including-magento-ui-library-to-your-theme"},{title:"loaders",filename:"loaders",url:"loaders.html"},{title:"Loaders",filename:"loaders",url:"loaders.html#loaders"},{title:"Default loader variables",filename:"loaders",url:"loaders.html#default-loader-variables"},{title:"Loading",filename:"loaders",url:"loaders.html#loading"},{title:"Loading default variables",filename:"loaders",url:"loaders.html#loading-default-variables"},{title:"messages",filename:"messages",url:"messages.html"},{title:"Messages",filename:"messages",url:"messages.html#messages"},{title:"Information message",filename:"messages",url:"messages.html#information-message"},{title:"Warning message",filename:"messages",url:"messages.html#warning-message"},{title:"Error message",filename:"messages",url:"messages.html#error-message"},{title:"Success message",filename:"messages",url:"messages.html#success-message"},{title:"Notice message",filename:"messages",url:"messages.html#notice-message"},{title:"Message with inner icon",filename:"messages",url:"messages.html#message-with-inner-icon"},{title:"Message with lateral icon",filename:"messages",url:"messages.html#message-with-lateral-icon"},{title:"Custom message style",filename:"messages",url:"messages.html#custom-message-style"},{title:"Messages global variables",filename:"messages",url:"messages.html#messages-global-variables"},{title:"pages",filename:"pages",url:"pages.html"},{title:"Pagination HTML markup",filename:"pages",url:"pages.html#pagination-html-markup"},{title:"Pagination variables",filename:"pages",url:"pages.html#pagination-variables"},{title:"Pagination with label and gradient background on links",filename:"pages",url:"pages.html#pagination-with-label-and-gradient-background-on-links"},{title:'Pagination with "previous"..."next" text links and label',filename:"pages",url:"pages.html#pagination-with-previousnext-text-links-and-label"},{title:"Pagination without label, with solid background",filename:"pages",url:"pages.html#pagination-without-label-with-solid-background"},{title:"popups",filename:"popups",url:"popups.html"},{title:"Popups",filename:"popups",url:"popups.html#popups"},{title:"Popup variables",filename:"popups",url:"popups.html#popup-variables"},{title:"Window overlay mixin variables",filename:"popups",url:"popups.html#window-overlay-mixin-variables"},{title:"Fixed height popup",filename:"popups",url:"popups.html#fixed-height-popup"},{title:"Fixed content height popup",filename:"popups",url:"popups.html#fixed-content-height-popup"},{title:"Margins for header, content and footer block in popup",filename:"popups",url:"popups.html#margins-for-header-content-and-footer-block-in-popup"},{title:"Popup titles styled as theme headings",filename:"popups",url:"popups.html#popup-titles-styled-as-theme-headings"},{title:"Popup action toolbar",filename:"popups",url:"popups.html#popup-action-toolbar"},{title:"Popup Close button without an icon",filename:"popups",url:"popups.html#popup-close-button-without-an-icon"},{title:"Modify the icon of popup Close button",filename:"popups",url:"popups.html#modify-the-icon-of-popup-close-button"},{title:"Modify overlay styles",filename:"popups",url:"popups.html#modify-overlay-styles"},{title:"rating",filename:"rating",url:"rating.html"},{title:"Ratings",filename:"rating",url:"rating.html#ratings"},{title:"Global rating variables",filename:"rating",url:"rating.html#global-rating-variables"},{title:"Rating with vote",filename:"rating",url:"rating.html#rating-with-vote"},{title:"Rating with vote icons number customization",filename:"rating",url:"rating.html#rating-with-vote-icons-number-customization"},{title:"Rating with vote icons colors customization",filename:"rating",url:"rating.html#rating-with-vote-icons-colors-customization"},{title:"Rating with vote icons symbol customization",filename:"rating",url:"rating.html#rating-with-vote-icons-symbol-customization"},{title:"Accessible rating with vote",filename:"rating",url:"rating.html#accessible-rating-with-vote"},{title:"Rating summary",filename:"rating",url:"rating.html#rating-summary"},{title:"Rating summary icons number customization",filename:"rating",url:"rating.html#rating-summary-icons-number-customization"},{title:"Rating summary icons color customization",filename:"rating",url:"rating.html#rating-summary-icons-color-customization"},{title:"Rating summary icons symbol customization",filename:"rating",url:"rating.html#rating-summary-icons-symbol-customization"},{title:"Rating summary hide label",filename:"rating",url:"rating.html#rating-summary-hide-label"},{title:"Rating summary multiple ratings",filename:"rating",url:"rating.html#rating-summary-multiple-ratings"},{title:"Rating hide label mixin",filename:"rating",url:"rating.html#rating-hide-label-mixin"},{title:"resets",filename:"resets",url:"resets.html"},{title:"Resets",filename:"resets",url:"resets.html#resets"},{title:"responsive",filename:"responsive",url:"responsive.html"},{title:"Responsive",filename:"responsive",url:"responsive.html#responsive"},{title:"Responsive mixins usage",filename:"responsive",url:"responsive.html#responsive-mixins-usage"},{title:"Media query style groups separation variables",filename:"responsive",url:"responsive.html#media-query-style-groups-separation-variables"},{title:"Responsive breakpoints",filename:"responsive",url:"responsive.html#responsive-breakpoints"},{title:"sections",filename:"sections",url:"sections.html"},{title:"Tabs and accordions",filename:"sections",url:"sections.html#tabs-and-accordions"},{title:"Tabs",filename:"sections",url:"sections.html#tabs"},{title:"Tabs mixin variables",filename:"sections",url:"sections.html#tabs-mixin-variables"},{title:"Tabs with content top border",filename:"sections",url:"sections.html#tabs-with-content-top-border"},{title:"Accordion",filename:"sections",url:"sections.html#accordion"},{title:"Accordion mixin variables",filename:"sections",url:"sections.html#accordion-mixin-variables"},{title:"Responsive tabs",filename:"sections",url:"sections.html#responsive-tabs"},{title:"Tabs Base",filename:"sections",url:"sections.html#tabs-base"},{title:"Accordion Base",filename:"sections",url:"sections.html#accordion-base"},{title:"tables",filename:"tables",url:"tables.html"},{title:"Tables",filename:"tables",url:"tables.html#tables"},{title:"Table mixin variables",filename:"tables",url:"tables.html#table-mixin-variables"},{title:"Table typography",filename:"tables",url:"tables.html#table-typography"},{title:"Table typography mixin variables",filename:"tables",url:"tables.html#table-typography-mixin-variables"},{title:"Table caption",filename:"tables",url:"tables.html#table-caption"},{title:"Table caption mixin variables",filename:"tables",url:"tables.html#table-caption-mixin-variables"},{title:"Table cells resize",filename:"tables",url:"tables.html#table-cells-resize"},{title:"Table cells resize variables",filename:"tables",url:"tables.html#table-cells-resize-variables"},{title:"Table background customization",filename:"tables",url:"tables.html#table-background-customization"},{title:"Table background mixin variables",filename:"tables",url:"tables.html#table-background-mixin-variables"},{title:"Table borders customization",filename:"tables",url:"tables.html#table-borders-customization"},{title:"Table borders mixin variables",filename:"tables",url:"tables.html#table-borders-mixin-variables"},{title:"Table with horizontal borders",filename:"tables",url:"tables.html#table-with-horizontal-borders"},{title:"Table with vertical borders",filename:"tables",url:"tables.html#table-with-vertical-borders"},{title:"Table with light borders",filename:"tables",url:"tables.html#table-with-light-borders"},{title:"Table without borders",filename:"tables",url:"tables.html#table-without-borders"},{title:"Striped table",filename:"tables",url:"tables.html#striped-table"},{title:"Striped table mixin variables",filename:"tables",url:"tables.html#striped-table-mixin-variables"},{title:"Table with rows hover",filename:"tables",url:"tables.html#table-with-rows-hover"},{title:"Table with rows hover mixin variables",filename:"tables",url:"tables.html#table-with-rows-hover-mixin-variables"},{title:"Responsive table technics #1",filename:"tables",url:"tables.html#responsive-table-technics-1"},{title:"Responsive table technics #2",filename:"tables",url:"tables.html#responsive-table-technics-2"},{title:"Responsive table technics #2 mixin variables",filename:"tables",url:"tables.html#responsive-table-technics-2-mixin-variables"},{title:"tooltips",filename:"tooltips",url:"tooltips.html"},{title:"Tooltips",filename:"tooltips",url:"tooltips.html#tooltips"},{title:"Tooltips variables",filename:"tooltips",url:"tooltips.html#tooltips-variables"},{title:"typography",filename:"typography",url:"typography.html"},{title:"Typogrphy",filename:"typography",url:"typography.html#typogrphy"},{title:"Typography variables",filename:"typography",url:"typography.html#typography-variables"},{title:"Font-size mixin",filename:"typography",url:"typography.html#fontsize-mixin"},{title:"Line-height mixin",filename:"typography",url:"typography.html#lineheight-mixin"},{title:"Word breaking mixin",filename:"typography",url:"typography.html#word-breaking-mixin"},{title:"Font face mixin",filename:"typography",url:"typography.html#font-face-mixin"},{title:"Text overflow mixin",filename:"typography",url:"typography.html#text-overflow-mixin"},{title:"Text hide",filename:"typography",url:"typography.html#text-hide"},{title:"Hyphens",filename:"typography",url:"typography.html#hyphens"},{title:"Font style and color",filename:"typography",url:"typography.html#font-style-and-color"},{title:"Font style mixin variables",filename:"typography",url:"typography.html#font-style-mixin-variables"},{title:"Reset list styles",filename:"typography",url:"typography.html#reset-list-styles"},{title:"Reset list styles variables",filename:"typography",url:"typography.html#reset-list-styles-variables"},{title:"Inline-block list item styling",filename:"typography",url:"typography.html#inlineblock-list-item-styling"},{title:"Link styling mixin",filename:"typography",url:"typography.html#link-styling-mixin"},{title:"Link styling mixin variables",filename:"typography",url:"typography.html#link-styling-mixin-variables"},{title:"Heading styling mixin",filename:"typography",url:"typography.html#heading-styling-mixin"},{title:"Base typography mixins",filename:"typography",url:"typography.html#base-typography-mixins"},{title:"Headings typography mixin",filename:"typography",url:"typography.html#headings-typography-mixin"},{title:"Typography links mixin",filename:"typography",url:"typography.html#typography-links-mixin"},{title:"Typography lists mixin",filename:"typography",url:"typography.html#typography-lists-mixin"},{title:"Typography code elements mixin",filename:"typography",url:"typography.html#typography-code-elements-mixin"},{title:"Typography blockquote",filename:"typography",url:"typography.html#typography-blockquote"},{title:"utilities",filename:"utilities",url:"utilities.html"},{title:"Utilities",filename:"utilities",url:"utilities.html#utilities"},{title:".clearfix()",filename:"utilities",url:"utilities.html#clearfix"},{title:".visibility-hidden()",filename:"utilities",url:"utilities.html#visibilityhidden"},{title:".visually-hidden()",filename:"utilities",url:"utilities.html#visuallyhidden"},{title:".visually-hidden-reset()",filename:"utilities",url:"utilities.html#visuallyhiddenreset"},{title:".css()",filename:"utilities",url:"utilities.html#css"},{title:".css() variables",filename:"utilities",url:"utilities.html#css-variables"},{title:".rotate()",filename:"utilities",url:"utilities.html#rotate"},{title:".rotate() variables",filename:"utilities",url:"utilities.html#rotate-variables"},{title:".input-placeholder()",filename:"utilities",url:"utilities.html#inputplaceholder"},{title:".input-placeholder() variables",filename:"utilities",url:"utilities.html#inputplaceholder-variables"},{title:".background-gradient()",filename:"utilities",url:"utilities.html#backgroundgradient"},{title:".background-gradient() variables",filename:"utilities",url:"utilities.html#backgroundgradient-variables"},{title:"variables",filename:"variables",url:"variables.html"},{title:"List of Global Variables",filename:"variables",url:"variables.html#list-of-global-variables"},{title:"Table with rows hover mixin variables",filename:"variables",url:"variables.html#table-with-rows-hover-mixin-variables"}];(function(){"use strict";var b=function(a,b){return Array.prototype.indexOf.call(a,b)!==-1},c=function(a,b){return Array.prototype.filter.call(a,b)},d=function(a,b){return Array.prototype.forEach.call(a,b)},e=document.getElementsByTagName("body")[0];e.addEventListener("click",function(a){var b=a.target;b.tagName.toLowerCase()==="svg"&&(b=b.parentNode);var c=!1;b.dataset.toggle!=null&&(a.preventDefault(),b.classList.contains("is-active")||(c=!0)),d(e.querySelectorAll("[data-toggle]"),function(a){a.classList.remove("is-active"),document.getElementById(a.dataset.toggle).hidden=!0}),c&&(b.classList.add("is-active"),document.getElementById(b.dataset.toggle).hidden=!1)}),function(){var f=e.getElementsByClassName("nav")[0];if(!f)return;var g=document.createElement("ul");g.className="nav-results",g.id="nav-search",g.hidden=!0,d(a,function(a){var b,c,d;b=document.createElement("li"),b._title=a.title.toLowerCase(),b.hidden=!0,b.appendChild(c=document.createElement("a")),c.href=a.url,c.innerHTML=a.title,c.appendChild(d=document.createElement("span")),d.innerHTML=a.filename,d.className="nav-results-filename",g.appendChild(b)}),f.appendChild(g);var h=g.children,i=function(a){d(h,function(a){a.hidden=!0});var b=this.value.toLowerCase(),e=[];b!==""&&(e=c(h,function(a){return a._title.indexOf(b)!==-1})),e.length>0?(d(e,function(a){a.hidden=!1}),g.hidden=!1):g.hidden=!0},j=f.querySelector('input[type="search"]');j.addEventListener("keyup",i),j.addEventListener("focus",i),e.addEventListener("click",function(a){if(a.target.classList&&a.target.classList.contains("search"))return;g.hidden=!0}),g.addEventListener("click",function(a){j.value=""});var k=document.createElement("ul");k.id="nav-toc",k.hidden=!0,k.className="nav-results toc-list",c(e.getElementsByTagName("*"),function(a){return b(["h1","h2","h3"],a.tagName.toLowerCase())}).map(function(a){var b=document.createElement("li"),c=document.createElement("a"),d=a.tagName.toLowerCase()[1];c.classList.add("level-"+d),b.appendChild(c),c.href="#"+a.id,c.innerHTML=a.innerHTML,k.appendChild(b)}),f.appendChild(k)}()})(),function(){"use strict";if(location.hash==="#__preview__"||location.protocol==="data:")return;var a=function(a,b){return Array.prototype.forEach.call(a,b)},b=function(a,b){var e=Array.prototype.slice.call(arguments,2);return d(a,function(a){return(c(b)?b||a:a[b]).apply(a,e)})},c=function(a){return Object.prototype.toString.call(a)==="[object Function]"},d=function(a,b){return Array.prototype.map.call(a,b)},e=function(a,b){return d(a,function(a){return a[b]})},f=function(a){var b={},c=a.split(";");for(var d=0;c.length>d;d++){var e=c[d].trim().split("=");b[e[0]]=e[1]}return b},g=function(a,c){return b(e(a,"classList"),"remove",c)},h=function(a,b){a.contentDocument.defaultView.postMessage(b,"*")},i=document.getElementsByTagName("head")[0],j=document.getElementsByTagName("body")[0],k=e(i.querySelectorAll('style[type="text/preview"]'),"innerHTML").join(""),l=e(i.querySelectorAll('script[type="text/preview"]'),"innerHTML").join(""),m=location.href.split("#")[0]+"#__preview__",n=document.createElement("iframe");n.src="data:text/html,",j.appendChild(n),n.addEventListener("load",function(){var b={sameOriginDataUri:!0};try{this.contentDocument,this.contentDocument||(b.sameOriginDataUri=!1)}catch(c){b.sameOriginDataUri=!1}this.parentNode.removeChild(this),a(j.getElementsByTagName("textarea"),function(a,c){o(a,b,c),q(),p(a)})});var o=function(a,b,c){var d,e,f;d=document.createElement("div"),d.appendChild(e=document.createElement("div")),d.className="preview",e.appendChild(f=document.createElement("iframe")),e.className="resizeable",f.setAttribute("scrolling","no"),f.name="iframe"+c++,f.addEventListener("load",function(){var c,d,e,f,g,i,j;j=this.contentDocument;if(!b.sameOriginDataUri&&this.src!==m)return;this.src===m&&(c=j.createElement("html"),c.appendChild(j.createElement("head")),c.appendChild(d=j.createElement("body")),d.innerHTML=a.textContent,j.replaceChild(c,j.documentElement)),g=j.createElement("head"),g.appendChild(f=j.createElement("style")),g.appendChild(e=j.createElement("script")),e.textContent=l,f.textContent=k,i=j.getElementsByTagName("head")[0],i.parentNode.replaceChild(g,i),h(this,"getHeight")});var g;b.sameOriginDataUri?g="data:text/html;charset=utf-8,"+encodeURIComponent("<!doctype html><html><head></head></body>"+a.textContent):g=m,f.setAttribute("src",g);var i=function(){f.contentDocument.body.innerHTML=this.value,h(f,"getHeight")};a.addEventListener("keypress",i),a.addEventListener("keyup",i),a.parentNode.insertBefore(d,a)},p=function(a){var b=document.createElement("div");b.className="preview-code",b.style.position="absolute",b.style.left="-9999px",j.appendChild(b);var c=parseInt(window.getComputedStyle(a).getPropertyValue("max-height"),10),d=function(a){b.textContent=this.value+"\n";var d=b.offsetHeight+2;d>=c?this.style.overflow="auto":this.style.overflow="hidden",this.style.height=b.offsetHeight+2+"px"};a.addEventListener("keypress",d),a.addEventListener("keyup",d),d.call(a)},q=function(){var b=j.getElementsByClassName("settings")[0],c=j.getElementsByClassName("resizeable"),d=30,e=function(b){document.cookie="preview-width="+b,a(c,function(a){b==="auto"&&(b=a.parentNode.offsetWidth),a.style.width=b+"px",h(a.getElementsByTagName("iframe")[0],"getHeight")})},i=f(document.cookie)["preview-width"];if(i){e(i),g(b.getElementsByClassName("is-active"),"is-active");var k=b.querySelector('button[data-width="'+i+'"]');k&&k.classList.add("is-active")}window.addEventListener("message",function(a){if(a.data==null||!a.source)return;var b=a.data,c=document.getElementsByName(a.source.name)[0];b.height!=null&&c&&(c.parentNode.style.height=b.height+d+"px")},!1),b&&c.length>0&&(b.hidden=!1,b.addEventListener("click",function(a){var c=a.target.tagName.toLowerCase(),d;if(c==="button")d=a.target;else{if(c!=="svg")return;d=a.target.parentNode}a.preventDefault(),g(b.getElementsByClassName("is-active"),"is-active"),d.classList.add("is-active");var f=d.dataset.width;e(f)}))}}()})()</script></body></html><!-- Generated with StyleDocco (http://jacobrask.github.com/styledocco). --> +</div><div class="code"><pre><code>.icons-image-list { + list-style: none; + padding: 0; + li { + float: left; + width: 33%; + > span { + .icon-image(@_icon-image: '@{baseDir}images/blank-theme-icons.png'); + } + .icon-search { + .icon-sprite-position(0, 0); + } + .icon-cart { + .icon-sprite-position(1, 0); + } + .icon-arrow-down { + .icon-sprite-position(2, 0); + } + .icon-arrow-up { + .icon-sprite-position(3, 0); + } + .icon-grid { + .icon-sprite-position(4, 0); + } + .icon-list { + .icon-sprite-position(5, 0); + } + .icon-remove { + .icon-sprite-position(6, 0); + } + .icon-star { + .icon-sprite-position(7, 0); + } + .icon-pointer-down { + .icon-sprite-position(8, 0); + } + .icon-pointer-up { + .icon-sprite-position(9, 0); + } + .icon-pointer-left { + .icon-sprite-position(10, 0); + } + .icon-pointer-right { + .icon-sprite-position(11, 0); + } + .icon-compare-empty { + .icon-sprite-position(0, 1); + } + .icon-compare-full { + .icon-sprite-position(1, 1); + } + .icon-wishlist-empty { + .icon-sprite-position(2, 1); + } + .icon-wishlist-full { + .icon-sprite-position(3, 1); + } + .icon-update { + .icon-sprite-position(4, 1); + } + .icon-collapse { + .icon-sprite-position(5, 1); + } + .icon-expand { + .icon-sprite-position(6, 1); + } + .icon-menu { + .icon-sprite-position(7, 1); + } + .icon-prev { + .icon-sprite-position(8, 1); + } + .icon-next { + .icon-sprite-position(9, 1); + } + .icon-settings { + .icon-sprite-position(10, 1); + } + .icon-info { + .icon-sprite-position(11, 1); + } + .icon-checkmark { + .icon-sprite-position(0, 2); + } + .icon-calendar { + .icon-sprite-position(1, 2); + } + .icon-comment { + .icon-sprite-position(2, 2); + } + .icon-comment-reflected { + .icon-sprite-position(3, 2); + } + .icon-envelope { + .icon-sprite-position(4, 2); + } + .icon-warning { + .icon-sprite-position(5, 2); + } + .icon-trash { + .icon-sprite-position(6, 2); + } + .icon-flag { + .icon-sprite-position(7, 2); + } + .icon-location { + .icon-sprite-position(8, 2); + } + .icon-up { + .icon-sprite-position(9, 2); + } + .icon-down { + .icon-sprite-position(10, 2); + } + } +} + +@icon-wishlist-full: '\e600'; +@icon-wishlist-empty: '\e601'; +@icon-warning: '\e602'; +@icon-update: '\e603'; +@icon-trash: '\e604'; +@icon-star: '\e605'; +@icon-settings: '\e606'; +@icon-pointer-down: '\e607'; +@icon-next: '\e608'; +@icon-menu: '\e609'; +@icon-location: '\e60a'; +@icon-list: '\e60b'; +@icon-info: '\e60c'; +@icon-grid: '\e60d'; +@icon-comment-reflected: '\e60e'; +@icon-collapse: '\e60f'; +@icon-checkmark: '\e610'; +@icon-cart: '\e611'; +@icon-calendar: '\e612'; +@icon-arrow-up: '\e613'; +@icon-arrow-down: '\e614'; +@icon-search: '\e615'; +@icon-remove: '\e616'; +@icon-prev: '\e617'; +@icon-pointer-up: '\e618'; +@icon-pointer-right: '\e619'; +@icon-pointer-left: '\e61a'; +@icon-flag: '\e61b'; +@icon-expand: '\e61c'; +@icon-envelope: '\e61d'; +@icon-compare-full: '\e61e'; +@icon-compare-empty: '\e61f'; +@icon-comment: '\e620'; +@icon-up: '\e621'; +@icon-down: '\e622'; +@icon-arrow-up-thin: '\e623'; +@icon-arrow-right-thin: '\e624'; +@icon-arrow-left-thin: '\e625'; +@icon-arrow-down-thin: '\e626'; + +.icons-font-list { + list-style: none; + padding: 0; + li { + float: left; + width: 25%; + margin-bottom: 35px; + text-align: center; + > span { + .icon-font('', @_icon-font-size: 34px); + &:before { + content: attr(data-icon); + margin: 0 auto; + display: block; + } + } + } +}</code></pre></div></article></section><div class="bar bottom"><div hidden class="settings container"><!-- Icons from http://iconmonstr.com--><button title="Desktop (1280)" data-width='1280'><svg viewBox="0 0 412 386" height="24" width="26" class="icon"><path d="m147.6,343.9c-4.5,15.9-26.2,37.6-42.1,42.1h201c-15.3,-4-38.1,-26.8-42.1,-42.1H147.6zM387,0.5H25c-13.8,0-25,11.2-25,25V294c0,13.8 11.2,25 25,25h362c13.8,0 25,-11.2 25,-25V25.5C412,11.7 400.8,0.5 387,0.5zM369.9,238.2H42.1L42.1,42.6 369.9,42.6V238.2z"></path></svg></button><button title="Laptop (1024)" data-width='1024'><svg viewBox="0 0 384 312" height="23" width="28" class="icon"><path d="m349.2,20.5c0,-11-9,-20-20,-20H53.6c-11,0-20,9-20,20v194H349.2v-194zm-27,167H60.6V27.5H322.2v160zm28,42H32.6L2.6,282.1c-3.5,6.2-3.5,13.8 0.1,19.9 3.6,6.2 10.2,9.9 17.3,9.9H363.1c7.1,0 13.7,-3.8 17.3,-10 3.6,-6.2 3.6,-13.8 0,-20l-30.2,-52.5zm-196.9,54 8,-23.5h60.5l8,23.5h-76.5z"></path></svg></button><button title="Tablet (768)" data-width='768'><svg viewBox="0 0 317 412" height="24" width="18" class="icon"><path d="M 316.5,380 V 32 c 0,-17.7 -14.3,-32 -32,-32 H 32 C 14.3,0 0,14.3 0,32 v 348 c 0,17.7 14.3,32 32,32 h 252.5 c 17.7,0 32,-14.3 32,-32 z M 40,367 V 45 H 276.5 V 367 H 40 z m 109.8,22.7 c 0,-4.7 3.8,-8.5 8.5,-8.5 4.7,0 8.5,3.8 8.5,8.5 0,4.7 -3.8,8.5 -8.5,8.5 -4.7,0 -8.5,-3.8 -8.5,-8.5 z"></path></svg></button><button title="Smart phone (320)" data-width='320'><svg viewBox="0 0 224 412" height="24" width="13" class="icon"><path d="M 190.7,0 H 33 C 14.8,0 0,14.8 0,33 v 346 c 0,18.2 14.8,33 33,33 h 157.7 c 18.2,0 33,-14.8 33,-33 V 33 c 0,-18.2 -14.8,-33 -33,-33 z M 94.3,30.2 h 37 c 2.2,0 4,1.8 4,4 0,2.2 -1.8,4 -4,4 h -37 c -2.2,0 -4,-1.8 -4,-4 0,-2.2 1.8,-4 4,-4 z m 18.5,362.8 c -8.8,0 -16,-7.2 -16,-16 0,-8.8 7.2,-16 16,-16 8.8,0 16,7.2 16,16 0,8.8 -7.2,16 -16,16 z M 198.6,343.8 H 25.1 V 68.2 h 173.5 v 275.5 z"></path></svg></button><button title="Feature phone (240)" data-width='240'><svg viewBox="0 0 201 412" height="24" width="12" class="icon"><path d="M 165.5,0.2 V 45 H 25 c -13.8,0 -25,11.2 -25,25 V 387 c 0,13.8 11.2,25 25,25 h 150.5 c 13.8,0 25,-11.2 25,-25 V 0.2 h -35 z M 65.2,366.5 H 34.2 v -24.5 h 31 v 24.5 z m 0,-44.3 H 34.2 v -24.5 h 31 v 24.5 z m 50.5,44.3 H 84.7 v -24.5 h 31 v 24.5 z m 0,-44.3 H 84.7 v -24.5 h 31 v 24.5 z m 50.5,44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-44.3 h -31 v -24.5 h 31 v 24.5 z m 0,-59.3 h -132 V 95.4 h 132 V 262.9 z"></path></svg></button><button title="Auto (100%)" data-width="auto" class="auto is-active">Auto</button></div></div><script>(function(){var a=[{title:"actions-toolbar",filename:"actions-toolbar",url:"actions-toolbar.html"},{title:"",filename:"actions-toolbar",url:"actions-toolbar.html#"},{title:"Actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar"},{title:"Actions toolbar mixin variables",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-mixin-variables"},{title:"Actions toolbar alignment",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-alignment"},{title:"Reverse primary and secondary blocks",filename:"actions-toolbar",url:"actions-toolbar.html#reverse-primary-and-secondary-blocks"},{title:"Actions toolbar indents customizations",filename:"actions-toolbar",url:"actions-toolbar.html#actions-toolbar-indents-customizations"},{title:"Responsive actions toolbar",filename:"actions-toolbar",url:"actions-toolbar.html#responsive-actions-toolbar"},{title:"breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html"},{title:"",filename:"breadcrumbs",url:"breadcrumbs.html#"},{title:"Breadcrumbs",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs"},{title:"Breadcrumbs variables",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-variables"},{title:"Button-styled breadcrumbs with gradient background, border, and no separating symbol",filename:"breadcrumbs",url:"breadcrumbs.html#buttonstyled-breadcrumbs-with-gradient-background-border-and-no-separating-symbol"},{title:"Breadcrumbs with solid background",filename:"breadcrumbs",url:"breadcrumbs.html#breadcrumbs-with-solid-background"},{title:"buttons",filename:"buttons",url:"buttons.html"},{title:"",filename:"buttons",url:"buttons.html#"},{title:"Default button",filename:"buttons",url:"buttons.html#default-button"},{title:"Button variables",filename:"buttons",url:"buttons.html#button-variables"},{title:"Button as an icon",filename:"buttons",url:"buttons.html#button-as-an-icon"},{title:"Button with an icon on the left or right side of the text",filename:"buttons",url:"buttons.html#button-with-an-icon-on-the-left-or-right-side-of-the-text"},{title:"Button with fixed width",filename:"buttons",url:"buttons.html#button-with-fixed-width"},{title:"Primary button",filename:"buttons",url:"buttons.html#primary-button"},{title:"Primary button variables",filename:"buttons",url:"buttons.html#primary-button-variables"},{title:"Button with gradient background",filename:"buttons",url:"buttons.html#button-with-gradient-background"},{title:"Button as a link",filename:"buttons",url:"buttons.html#button-as-a-link"},{title:"Button as a link variables",filename:"buttons",url:"buttons.html#button-as-a-link-variables"},{title:"Link as a button",filename:"buttons",url:"buttons.html#link-as-a-button"},{title:"Button reset",filename:"buttons",url:"buttons.html#button-reset"},{title:"Button revert secondary color",filename:"buttons",url:"buttons.html#button-revert-secondary-color"},{title:"Button revert secondary color variables",filename:"buttons",url:"buttons.html#button-revert-secondary-color-variables"},{title:"Button revert secondary size",filename:"buttons",url:"buttons.html#button-revert-secondary-size"},{title:"Button revert secondary size variables",filename:"buttons",url:"buttons.html#button-revert-secondary-size-variables"},{title:"docs",filename:"docs",url:"docs.html"},{title:"",filename:"docs",url:"docs.html#"},{title:"Documentation",filename:"docs",url:"docs.html#documentation"},{title:"dropdowns",filename:"dropdowns",url:"dropdowns.html"},{title:"",filename:"dropdowns",url:"dropdowns.html#"},{title:"Drop-down and split buttons mixins",filename:"dropdowns",url:"dropdowns.html#dropdown-and-split-buttons-mixins"},{title:"Drop-down",filename:"dropdowns",url:"dropdowns.html#dropdown"},{title:"Drop-down variables",filename:"dropdowns",url:"dropdowns.html#dropdown-variables"},{title:"Drop-down with icon customization",filename:"dropdowns",url:"dropdowns.html#dropdown-with-icon-customization"},{title:"Modify dropdown list styles",filename:"dropdowns",url:"dropdowns.html#modify-dropdown-list-styles"},{title:"Split button",filename:"dropdowns",url:"dropdowns.html#split-button"},{title:"Split button variables",filename:"dropdowns",url:"dropdowns.html#split-button-variables"},{title:"Split button - button styling",filename:"dropdowns",url:"dropdowns.html#split-button-button-styling"},{title:"Split button icon customization",filename:"dropdowns",url:"dropdowns.html#split-button-icon-customization"},{title:"Split button drop-down list customization",filename:"dropdowns",url:"dropdowns.html#split-button-dropdown-list-customization"},{title:"forms",filename:"forms",url:"forms.html"},{title:"",filename:"forms",url:"forms.html#"},{title:"Forms mixins",filename:"forms",url:"forms.html#forms-mixins"},{title:"Global forms elements customization",filename:"forms",url:"forms.html#global-forms-elements-customization"},{title:"Fieldsets & fields customization",filename:"forms",url:"forms.html#fieldsets-fields-customization"},{title:"Fieldset and legend customization variables",filename:"forms",url:"forms.html#fieldset-and-legend-customization-variables"},{title:"Fields customization variables",filename:"forms",url:"forms.html#fields-customization-variables"},{title:"Required fields message customization variables",filename:"forms",url:"forms.html#required-fields-message-customization-variables"},{title:"Form element inputs customization",filename:"forms",url:"forms.html#form-element-inputs-customization"},{title:"Form element inputs customization variables",filename:"forms",url:"forms.html#form-element-inputs-customization-variables"},{title:"Form element choice",filename:"forms",url:"forms.html#form-element-choice"},{title:"Form element choice variables",filename:"forms",url:"forms.html#form-element-choice-variables"},{title:"Custom color",filename:"forms",url:"forms.html#custom-color"},{title:"Input number - input-text view",filename:"forms",url:"forms.html#input-number-inputtext-view"},{title:"Input search - input-text view",filename:"forms",url:"forms.html#input-search-inputtext-view"},{title:"Form validation",filename:"forms",url:"forms.html#form-validation"},{title:"Form validation variables// <pre>",filename:"forms",url:"forms.html#form-validation-variables-pre"},{title:"icons",filename:"icons",url:"icons.html"},{title:"Icons",filename:"icons",url:"icons.html#icons"},{title:"Icon with image or sprite",filename:"icons",url:"icons.html#icon-with-image-or-sprite"},{title:"Icon with image or sprite variables",filename:"icons",url:"icons.html#icon-with-image-or-sprite-variables"},{title:"Icon position for an icon with image or sprite",filename:"icons",url:"icons.html#icon-position-for-an-icon-with-image-or-sprite"},{title:"Position for icon with image or sprite mixin variables",filename:"icons",url:"icons.html#position-for-icon-with-image-or-sprite-mixin-variables"},{title:"Icon sprite position (with grid)",filename:"icons",url:"icons.html#icon-sprite-position-with-grid"},{title:"Icon sprite position variables",filename:"icons",url:"icons.html#icon-sprite-position-variables"},{title:"Image/sprite icon size",filename:"icons",url:"icons.html#imagesprite-icon-size"},{title:"Image/sprite icon size variables",filename:"icons",url:"icons.html#imagesprite-icon-size-variables"},{title:"Font icon",filename:"icons",url:"icons.html#font-icon"},{title:"Font icon variables",filename:"icons",url:"icons.html#font-icon-variables"},{title:"Change the size of font icon",filename:"icons",url:"icons.html#change-the-size-of-font-icon"},{title:"Change the size of font icon variables",filename:"icons",url:"icons.html#change-the-size-of-font-icon-variables"},{title:"Hide icon text",filename:"icons",url:"icons.html#hide-icon-text"},{title:"Sprite and font icons for Blank theme",filename:"icons",url:"icons.html#sprite-and-font-icons-for-blank-theme"},{title:"layout",filename:"layout",url:"layout.html"},{title:"",filename:"layout",url:"layout.html#"},{title:"Layout",filename:"layout",url:"layout.html#layout"},{title:"Layout global variables",filename:"layout",url:"layout.html#layout-global-variables"},{title:"Page layouts",filename:"layout",url:"layout.html#page-layouts"},{title:"Layout column",filename:"layout",url:"layout.html#layout-column"},{title:"Layout column variables",filename:"layout",url:"layout.html#layout-column-variables"},{title:"Layout width",filename:"layout",url:"layout.html#layout-width"},{title:"Layout width variables",filename:"layout",url:"layout.html#layout-width-variables"},{title:"lib",filename:"lib",url:"lib.html"},{title:"",filename:"lib",url:"lib.html#"},{title:"Including Magento UI library to your theme",filename:"lib",url:"lib.html#including-magento-ui-library-to-your-theme"},{title:"loaders",filename:"loaders",url:"loaders.html"},{title:"",filename:"loaders",url:"loaders.html#"},{title:"Loaders",filename:"loaders",url:"loaders.html#loaders"},{title:"Default loader variables",filename:"loaders",url:"loaders.html#default-loader-variables"},{title:"Loading",filename:"loaders",url:"loaders.html#loading"},{title:"Loading default variables",filename:"loaders",url:"loaders.html#loading-default-variables"},{title:"messages",filename:"messages",url:"messages.html"},{title:"",filename:"messages",url:"messages.html#"},{title:"Messages",filename:"messages",url:"messages.html#messages"},{title:"Information message",filename:"messages",url:"messages.html#information-message"},{title:"Warning message",filename:"messages",url:"messages.html#warning-message"},{title:"Error message",filename:"messages",url:"messages.html#error-message"},{title:"Success message",filename:"messages",url:"messages.html#success-message"},{title:"Notice message",filename:"messages",url:"messages.html#notice-message"},{title:"Message with inner icon",filename:"messages",url:"messages.html#message-with-inner-icon"},{title:"Message with lateral icon",filename:"messages",url:"messages.html#message-with-lateral-icon"},{title:"Custom message style",filename:"messages",url:"messages.html#custom-message-style"},{title:"Messages global variables",filename:"messages",url:"messages.html#messages-global-variables"},{title:"pages",filename:"pages",url:"pages.html"},{title:"",filename:"pages",url:"pages.html#"},{title:"Pagination HTML markup",filename:"pages",url:"pages.html#pagination-html-markup"},{title:"Pagination variables",filename:"pages",url:"pages.html#pagination-variables"},{title:"Pagination with label and gradient background on links",filename:"pages",url:"pages.html#pagination-with-label-and-gradient-background-on-links"},{title:'Pagination with "previous"..."next" text links and label',filename:"pages",url:"pages.html#pagination-with-previousnext-text-links-and-label"},{title:"Pagination without label, with solid background",filename:"pages",url:"pages.html#pagination-without-label-with-solid-background"},{title:"popups",filename:"popups",url:"popups.html"},{title:"",filename:"popups",url:"popups.html#"},{title:"Popups",filename:"popups",url:"popups.html#popups"},{title:"Popup variables",filename:"popups",url:"popups.html#popup-variables"},{title:"Window overlay mixin variables",filename:"popups",url:"popups.html#window-overlay-mixin-variables"},{title:"Fixed height popup",filename:"popups",url:"popups.html#fixed-height-popup"},{title:"Fixed content height popup",filename:"popups",url:"popups.html#fixed-content-height-popup"},{title:"Margins for header, content and footer block in popup",filename:"popups",url:"popups.html#margins-for-header-content-and-footer-block-in-popup"},{title:"Popup titles styled as theme headings",filename:"popups",url:"popups.html#popup-titles-styled-as-theme-headings"},{title:"Popup action toolbar",filename:"popups",url:"popups.html#popup-action-toolbar"},{title:"Popup Close button without an icon",filename:"popups",url:"popups.html#popup-close-button-without-an-icon"},{title:"Modify the icon of popup Close button",filename:"popups",url:"popups.html#modify-the-icon-of-popup-close-button"},{title:"Modify overlay styles",filename:"popups",url:"popups.html#modify-overlay-styles"},{title:"rating",filename:"rating",url:"rating.html"},{title:"",filename:"rating",url:"rating.html#"},{title:"Ratings",filename:"rating",url:"rating.html#ratings"},{title:"Global rating variables",filename:"rating",url:"rating.html#global-rating-variables"},{title:"Rating with vote",filename:"rating",url:"rating.html#rating-with-vote"},{title:"Rating with vote icons number customization",filename:"rating",url:"rating.html#rating-with-vote-icons-number-customization"},{title:"Rating with vote icons colors customization",filename:"rating",url:"rating.html#rating-with-vote-icons-colors-customization"},{title:"Rating with vote icons symbol customization",filename:"rating",url:"rating.html#rating-with-vote-icons-symbol-customization"},{title:"Accessible rating with vote",filename:"rating",url:"rating.html#accessible-rating-with-vote"},{title:"Rating summary",filename:"rating",url:"rating.html#rating-summary"},{title:"Rating summary icons number customization",filename:"rating",url:"rating.html#rating-summary-icons-number-customization"},{title:"Rating summary icons color customization",filename:"rating",url:"rating.html#rating-summary-icons-color-customization"},{title:"Rating summary icons symbol customization",filename:"rating",url:"rating.html#rating-summary-icons-symbol-customization"},{title:"Rating summary hide label",filename:"rating",url:"rating.html#rating-summary-hide-label"},{title:"Rating summary multiple ratings",filename:"rating",url:"rating.html#rating-summary-multiple-ratings"},{title:"Rating hide label mixin",filename:"rating",url:"rating.html#rating-hide-label-mixin"},{title:"resets",filename:"resets",url:"resets.html"},{title:"",filename:"resets",url:"resets.html#"},{title:"Resets",filename:"resets",url:"resets.html#resets"},{title:"responsive",filename:"responsive",url:"responsive.html"},{title:"",filename:"responsive",url:"responsive.html#"},{title:"Responsive",filename:"responsive",url:"responsive.html#responsive"},{title:"Responsive mixins usage",filename:"responsive",url:"responsive.html#responsive-mixins-usage"},{title:"Media query style groups separation variables",filename:"responsive",url:"responsive.html#media-query-style-groups-separation-variables"},{title:"Responsive breakpoints",filename:"responsive",url:"responsive.html#responsive-breakpoints"},{title:"sections",filename:"sections",url:"sections.html"},{title:"",filename:"sections",url:"sections.html#"},{title:"Tabs and accordions",filename:"sections",url:"sections.html#tabs-and-accordions"},{title:"Tabs",filename:"sections",url:"sections.html#tabs"},{title:"Tabs mixin variables",filename:"sections",url:"sections.html#tabs-mixin-variables"},{title:"Tabs with content top border",filename:"sections",url:"sections.html#tabs-with-content-top-border"},{title:"Accordion",filename:"sections",url:"sections.html#accordion"},{title:"Accordion mixin variables",filename:"sections",url:"sections.html#accordion-mixin-variables"},{title:"Responsive tabs",filename:"sections",url:"sections.html#responsive-tabs"},{title:"Tabs Base",filename:"sections",url:"sections.html#tabs-base"},{title:"Accordion Base",filename:"sections",url:"sections.html#accordion-base"},{title:"tables",filename:"tables",url:"tables.html"},{title:"",filename:"tables",url:"tables.html#"},{title:"Tables",filename:"tables",url:"tables.html#tables"},{title:"Table mixin variables",filename:"tables",url:"tables.html#table-mixin-variables"},{title:"Table typography",filename:"tables",url:"tables.html#table-typography"},{title:"Table typography mixin variables",filename:"tables",url:"tables.html#table-typography-mixin-variables"},{title:"Table caption",filename:"tables",url:"tables.html#table-caption"},{title:"Table caption mixin variables",filename:"tables",url:"tables.html#table-caption-mixin-variables"},{title:"Table cells resize",filename:"tables",url:"tables.html#table-cells-resize"},{title:"Table cells resize variables",filename:"tables",url:"tables.html#table-cells-resize-variables"},{title:"Table background customization",filename:"tables",url:"tables.html#table-background-customization"},{title:"Table background mixin variables",filename:"tables",url:"tables.html#table-background-mixin-variables"},{title:"Table borders customization",filename:"tables",url:"tables.html#table-borders-customization"},{title:"Table borders mixin variables",filename:"tables",url:"tables.html#table-borders-mixin-variables"},{title:"Table with horizontal borders",filename:"tables",url:"tables.html#table-with-horizontal-borders"},{title:"Table with vertical borders",filename:"tables",url:"tables.html#table-with-vertical-borders"},{title:"Table with light borders",filename:"tables",url:"tables.html#table-with-light-borders"},{title:"Table without borders",filename:"tables",url:"tables.html#table-without-borders"},{title:"Striped table",filename:"tables",url:"tables.html#striped-table"},{title:"Striped table mixin variables",filename:"tables",url:"tables.html#striped-table-mixin-variables"},{title:"Table with rows hover",filename:"tables",url:"tables.html#table-with-rows-hover"},{title:"Table with rows hover mixin variables",filename:"tables",url:"tables.html#table-with-rows-hover-mixin-variables"},{title:"Responsive table technics #1",filename:"tables",url:"tables.html#responsive-table-technics-1"},{title:"Responsive table technics #2",filename:"tables",url:"tables.html#responsive-table-technics-2"},{title:"Responsive table technics #2 mixin variables",filename:"tables",url:"tables.html#responsive-table-technics-2-mixin-variables"},{title:"tooltips",filename:"tooltips",url:"tooltips.html"},{title:"",filename:"tooltips",url:"tooltips.html#"},{title:"Tooltips",filename:"tooltips",url:"tooltips.html#tooltips"},{title:"Tooltips variables",filename:"tooltips",url:"tooltips.html#tooltips-variables"},{title:"typography",filename:"typography",url:"typography.html"},{title:"",filename:"typography",url:"typography.html#"},{title:"Typogrphy",filename:"typography",url:"typography.html#typogrphy"},{title:"Typography variables",filename:"typography",url:"typography.html#typography-variables"},{title:"Font-size mixin",filename:"typography",url:"typography.html#fontsize-mixin"},{title:"Line-height mixin",filename:"typography",url:"typography.html#lineheight-mixin"},{title:"Word breaking mixin",filename:"typography",url:"typography.html#word-breaking-mixin"},{title:"Font face mixin",filename:"typography",url:"typography.html#font-face-mixin"},{title:"Text overflow mixin",filename:"typography",url:"typography.html#text-overflow-mixin"},{title:"Text hide",filename:"typography",url:"typography.html#text-hide"},{title:"Hyphens",filename:"typography",url:"typography.html#hyphens"},{title:"Font style and color",filename:"typography",url:"typography.html#font-style-and-color"},{title:"Font style mixin variables",filename:"typography",url:"typography.html#font-style-mixin-variables"},{title:"Reset list styles",filename:"typography",url:"typography.html#reset-list-styles"},{title:"Reset list styles variables",filename:"typography",url:"typography.html#reset-list-styles-variables"},{title:"Inline-block list item styling",filename:"typography",url:"typography.html#inlineblock-list-item-styling"},{title:"Link styling mixin",filename:"typography",url:"typography.html#link-styling-mixin"},{title:"Link styling mixin variables",filename:"typography",url:"typography.html#link-styling-mixin-variables"},{title:"Heading styling mixin",filename:"typography",url:"typography.html#heading-styling-mixin"},{title:"Base typography mixins",filename:"typography",url:"typography.html#base-typography-mixins"},{title:"Headings typography mixin",filename:"typography",url:"typography.html#headings-typography-mixin"},{title:"Typography links mixin",filename:"typography",url:"typography.html#typography-links-mixin"},{title:"Typography lists mixin",filename:"typography",url:"typography.html#typography-lists-mixin"},{title:"Typography code elements mixin",filename:"typography",url:"typography.html#typography-code-elements-mixin"},{title:"Typography blockquote",filename:"typography",url:"typography.html#typography-blockquote"},{title:"utilities",filename:"utilities",url:"utilities.html"},{title:"",filename:"utilities",url:"utilities.html#"},{title:"Utilities",filename:"utilities",url:"utilities.html#utilities"},{title:".clearfix()",filename:"utilities",url:"utilities.html#clearfix"},{title:".visibility-hidden()",filename:"utilities",url:"utilities.html#visibilityhidden"},{title:".visually-hidden()",filename:"utilities",url:"utilities.html#visuallyhidden"},{title:".visually-hidden-reset()",filename:"utilities",url:"utilities.html#visuallyhiddenreset"},{title:".css()",filename:"utilities",url:"utilities.html#css"},{title:".css() variables",filename:"utilities",url:"utilities.html#css-variables"},{title:".rotate()",filename:"utilities",url:"utilities.html#rotate"},{title:".rotate() variables",filename:"utilities",url:"utilities.html#rotate-variables"},{title:".input-placeholder()",filename:"utilities",url:"utilities.html#inputplaceholder"},{title:".input-placeholder() variables",filename:"utilities",url:"utilities.html#inputplaceholder-variables"},{title:".background-gradient()",filename:"utilities",url:"utilities.html#backgroundgradient"},{title:".background-gradient() variables",filename:"utilities",url:"utilities.html#backgroundgradient-variables"},{title:"variables",filename:"variables",url:"variables.html"},{title:"",filename:"variables",url:"variables.html#"},{title:"List of Global Variables",filename:"variables",url:"variables.html#list-of-global-variables"},{title:"Table with rows hover mixin variables",filename:"variables",url:"variables.html#table-with-rows-hover-mixin-variables"}];(function(){"use strict";var b=function(a,b){return Array.prototype.indexOf.call(a,b)!==-1},c=function(a,b){return Array.prototype.filter.call(a,b)},d=function(a,b){return Array.prototype.forEach.call(a,b)},e=document.getElementsByTagName("body")[0];e.addEventListener("click",function(a){var b=a.target;b.tagName.toLowerCase()==="svg"&&(b=b.parentNode);var c=!1;b.dataset.toggle!=null&&(a.preventDefault(),b.classList.contains("is-active")||(c=!0)),d(e.querySelectorAll("[data-toggle]"),function(a){a.classList.remove("is-active"),document.getElementById(a.dataset.toggle).hidden=!0}),c&&(b.classList.add("is-active"),document.getElementById(b.dataset.toggle).hidden=!1)}),function(){var f=e.getElementsByClassName("nav")[0];if(!f)return;var g=document.createElement("ul");g.className="nav-results",g.id="nav-search",g.hidden=!0,d(a,function(a){var b,c,d;b=document.createElement("li"),b._title=a.title.toLowerCase(),b.hidden=!0,b.appendChild(c=document.createElement("a")),c.href=a.url,c.innerHTML=a.title,c.appendChild(d=document.createElement("span")),d.innerHTML=a.filename,d.className="nav-results-filename",g.appendChild(b)}),f.appendChild(g);var h=g.children,i=function(a){d(h,function(a){a.hidden=!0});var b=this.value.toLowerCase(),e=[];b!==""&&(e=c(h,function(a){return a._title.indexOf(b)!==-1})),e.length>0?(d(e,function(a){a.hidden=!1}),g.hidden=!1):g.hidden=!0},j=f.querySelector('input[type="search"]');j.addEventListener("keyup",i),j.addEventListener("focus",i),e.addEventListener("click",function(a){if(a.target.classList&&a.target.classList.contains("search"))return;g.hidden=!0}),g.addEventListener("click",function(a){j.value=""});var k=document.createElement("ul");k.id="nav-toc",k.hidden=!0,k.className="nav-results toc-list",c(e.getElementsByTagName("*"),function(a){return b(["h1","h2","h3"],a.tagName.toLowerCase())}).map(function(a){var b=document.createElement("li"),c=document.createElement("a"),d=a.tagName.toLowerCase()[1];c.classList.add("level-"+d),b.appendChild(c),c.href="#"+a.id,c.innerHTML=a.innerHTML,k.appendChild(b)}),f.appendChild(k)}()})(),function(){"use strict";if(location.hash==="#__preview__"||location.protocol==="data:")return;var a=function(a,b){return Array.prototype.forEach.call(a,b)},b=function(a,b){var e=Array.prototype.slice.call(arguments,2);return d(a,function(a){return(c(b)?b||a:a[b]).apply(a,e)})},c=function(a){return Object.prototype.toString.call(a)==="[object Function]"},d=function(a,b){return Array.prototype.map.call(a,b)},e=function(a,b){return d(a,function(a){return a[b]})},f=function(a){var b={},c=a.split(";");for(var d=0;c.length>d;d++){var e=c[d].trim().split("=");b[e[0]]=e[1]}return b},g=function(a,c){return b(e(a,"classList"),"remove",c)},h=function(a,b){a.contentDocument.defaultView.postMessage(b,"*")},i=document.getElementsByTagName("head")[0],j=document.getElementsByTagName("body")[0],k=e(i.querySelectorAll('style[type="text/preview"]'),"innerHTML").join(""),l=e(i.querySelectorAll('script[type="text/preview"]'),"innerHTML").join(""),m=location.href.split("#")[0]+"#__preview__",n=document.createElement("iframe");n.src="data:text/html,",j.appendChild(n),n.addEventListener("load",function(){var b={sameOriginDataUri:!0};try{this.contentDocument,this.contentDocument||(b.sameOriginDataUri=!1)}catch(c){b.sameOriginDataUri=!1}this.parentNode.removeChild(this),a(j.getElementsByTagName("textarea"),function(a,c){o(a,b,c),q(),p(a)})});var o=function(a,b,c){var d,e,f;d=document.createElement("div"),d.appendChild(e=document.createElement("div")),d.className="preview",e.appendChild(f=document.createElement("iframe")),e.className="resizeable",f.setAttribute("scrolling","no"),f.name="iframe"+c++,f.addEventListener("load",function(){var c,d,e,f,g,i,j;j=this.contentDocument;if(!b.sameOriginDataUri&&this.src!==m)return;this.src===m&&(c=j.createElement("html"),c.appendChild(j.createElement("head")),c.appendChild(d=j.createElement("body")),d.innerHTML=a.textContent,j.replaceChild(c,j.documentElement)),g=j.createElement("head"),g.appendChild(f=j.createElement("style")),g.appendChild(e=j.createElement("script")),e.textContent=l,f.textContent=k,i=j.getElementsByTagName("head")[0],i.parentNode.replaceChild(g,i),h(this,"getHeight")});var g;b.sameOriginDataUri?g="data:text/html;charset=utf-8,"+encodeURIComponent("<!doctype html><html><head></head></body>"+a.textContent):g=m,f.setAttribute("src",g);var i=function(){f.contentDocument.body.innerHTML=this.value,h(f,"getHeight")};a.addEventListener("keypress",i),a.addEventListener("keyup",i),a.parentNode.insertBefore(d,a)},p=function(a){var b=document.createElement("div");b.className="preview-code",b.style.position="absolute",b.style.left="-9999px",j.appendChild(b);var c=parseInt(window.getComputedStyle(a).getPropertyValue("max-height"),10),d=function(a){b.textContent=this.value+"\n";var d=b.offsetHeight+2;d>=c?this.style.overflow="auto":this.style.overflow="hidden",this.style.height=b.offsetHeight+2+"px"};a.addEventListener("keypress",d),a.addEventListener("keyup",d),d.call(a)},q=function(){var b=j.getElementsByClassName("settings")[0],c=j.getElementsByClassName("resizeable"),d=30,e=function(b){document.cookie="preview-width="+b,a(c,function(a){b==="auto"&&(b=a.parentNode.offsetWidth),a.style.width=b+"px",h(a.getElementsByTagName("iframe")[0],"getHeight")})},i=f(document.cookie)["preview-width"];if(i){e(i),g(b.getElementsByClassName("is-active"),"is-active");var k=b.querySelector('button[data-width="'+i+'"]');k&&k.classList.add("is-active")}window.addEventListener("message",function(a){if(a.data==null||!a.source)return;var b=a.data,c=document.getElementsByName(a.source.name)[0];b.height!=null&&c&&(c.parentNode.style.height=b.height+d+"px")},!1),b&&c.length>0&&(b.hidden=!1,b.addEventListener("click",function(a){var c=a.target.tagName.toLowerCase(),d;if(c==="button")d=a.target;else{if(c!=="svg")return;d=a.target.parentNode}a.preventDefault(),g(b.getElementsByClassName("is-active"),"is-active"),d.classList.add("is-active");var f=d.dataset.width;e(f)}))}}()})()</script></body></html><!-- Generated with StyleDocco (http://jacobrask.github.com/styledocco). --> diff --git a/lib/web/css/docs/source/icons.less b/lib/web/css/docs/source/icons.less index 97f05c59a01..355ece1b150 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 443228833b6..999e9c2cf79 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 GIT binary patch delta 3851 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 E4<Z&xE&u=k literal 6728 zcmcIpeUKc*b??_b-@CJ4v%7P9cUs+k-2y^)x3{-DLWny_kmybz#D|12q(CQ-k%ji8 z2q+GjDByrCszgjA#Q{Vq5Fw%%Lb(zLiIh`PNN_1Gf`XDV1_|d68^z^Vlq*$9D#V)0 zuV;2oC*cZEmGsVZzkdDR>+UzNyWi^_?`G`b9Am^dyD$-ZiX`T`8!p64+AwW7xGZ~d z8)HSboNZ>4Y>M5>7P2*LBiq1Qco(t>b{E?M{C!}Gv73OqhdmI`ZUZLEZUJT+TE84n z^|2ZoU_)s6Y!X2z2Nq$EFu{ga-#j=R+bwPc=DT>;-PM}h+P(Iz9U$sO{knT5@7szp zf%-<2#yy)K`qG<!d7^|m@accpxMA{c{-yuggK;fIdvhZY`Y~}9^=Z`08(a5J{}H?7 zE!3Yw{o9+j+%@^oi&Cb09qPBWCa1TuQFaFPL#X#nO|~{1U-yOYpne>E?Af~IzWXsw zq}*@Fb|w@?PcfA-{tSmy_KmQle`R$tCEc7v81{u}DPw1<;@Av+;uu41_9IEUKA8m{ zSoWAkzfx0arm#gQEoPvN1J`$^I&*Gj1~~AXVF64tKkioA96<vzVg#yqASJ}Xc)Tm5 z(9e#eBKuGNBff(TgK2<bq-$v{t&jAN^fv~$rpI{J%?rJ$H8l@!Qy&%HC<v?kV0LIh z+2S%qiwg(3GJSE1SQD#8X--<QdPUR}$-K*VL@3^u<w6xms^Hmxyu4s2>#kbWoWnxR zRjb@UHs-<Sj1OPvbB)lA3B92W@ah1KlGn_0x0!8bF^g<7Gb-FXX7@QK5wjMJ4iMFr zE{<5L-IYpI3VEGWL*b+<s@YqvIEkF8#6I_AFRNJllUI#iP6`by8I5Num2OkjyYdbR zpzsKC=I2z+>MHkl$?q%JyX=^_lph0Rzy_E}1#(J_dZt<$q<Ti@%zu~P<iFcDHWu$o z^9hF^^I={7=<x6tpPZO@GSKY=nfx$+5Sv1vTTz9^s=8OjH_k&rBGW5$Z)jv_q&5OI z>M>Cb)F~QEc(bARicA_x1!W^U%00JHb@>B!Z$6($l?wCiKH5?>vu-XL$!615Bo)<Y z#7yK8IV;lzq??(GY_k>fvEtS$UloZ*F>NjG#OH6MODx+GM8b#|W-d3+hWRKWA_TP5 z7e8ynO_fO1Y%SvU^u$S1G|Y+w=T5a$v_nZ`*x6{`m+4ZeJDogsjQ<^U*UJj5pDn=l z)?kZaUDZ-!kV<jN$hTgrC+oFBkk=d4YCThGIE7>(=@c4;j9$vr8}-?YzwTTcb+>dy zS2{^2RVG$;Qi)$oO&y-WQY`yNX#7;Uys}c6s8slGYSoNwXQ0n7`iE)a3&{nQia$YR z|1?d2=v0s}PGYCnAyMH!WXq)Giv?625T#;_$4TaTFXd@I1%;cZ;pP~*!zk;EVeYk2 zJ~Bui@`k7o7lNNy8Wa+wr6+=dI2~Gsj0;8ZLx+es$2yb?nrP{vpn-$>O__m+zbP|P zgrM!;lRUwq-M&32q=@frCn1zz|KaRC_Kc|Ve_>U&1fy>Za<3YvK)Y3aK0&|px$cf( z0`)QOdV@4ZYH@%!Mn-vkIL|Zb7%z#cIqp=3%&Q0IUEMQq{g7I8Zaj|>U2T;Ao>R)j z<GGU4De3vEXIpRVNSMXUiWrqV>7wK<rX?>1N^9tD{tEBKT4CgRwB{95jvSG8L-Ydm z@H_birlV5TUETF+{LcNok3Z4#483un`-xpW`#~pg_U#jo@DH)Gn>b>blTjOL5^pA1 zX;d<g2zCxc;mbdqplb<sa4k*vGlUBEycO(O{yIN{vjGN6_||fv)rLl)o&jFUT&yR~ z`mY(DxA@l<<C!;nO@A~UH_doD8cin*Bax2sGZI_<`eT!mkA1x=Y5&axI+BrOnFz>& zqfLXoJqLUHNqgK5>tgdTdTH*J404iCkjYvm$W9T1iLaEo|Jr#tfMm-V-}hUsb4O+{ zw^r+LtF^n;f{r-tVyF21{2=Cd>-jm>hud>>FzHfzo@3M;83;{27Hm0^3PwWdIGslX zs^Ql}GYM0VrXrDS+|uoo6;qPwj3MooD+(Vr?QA4Iue&QEVm8h$h15hkYjTzI8d;XE zMG|ID^YUKK1@VJYhmoYM2W2X%`!A=m4w$%NMJ#1!cOk8#D^s!KaTS)&9oONiu6{-7 z%J<n;%v5{JC4*y~V0(sc_d&NEn+SDV#Ok;l8m>1=nJWpIhfSqKv(*5nURXV~XV0m< zdr$A#<4=4N;y3LHlmB~rg9K`sV7pm%hX0H|%le>g9OBjH0LO-&$qR2dJKXeKDBI)5 zRoymJPSw#{28V7QEmCFanwptOI>z&q&S*C6)-1OxXIGXD_7LTVmscvwhPts+h}D;R zi&GHI&eE&Gp_8y7SPo3&Ebl+}KAkL=F$RtOlz+^hmTLlE4o8iPlcvhgUa@}lmCi%W zleTx=9V0e>y0mJ1Y4*+qKPatlZ5_(PT;Ls@WRHu>_{YJTxB)KecJ>YSB72>^&3^nV z?5EydH0KTKGEp0nz5v&1oi^7gU`^?Pb$w#<kqWtBH}Wn<{9jPepW9tY%Sv|Hwwto7 zlxv^981d*;zyIj1W-Miz>15QxX$K><lH2L-beBVlVVnN69yL|fjOs>M8WVcdQdKJo z^9;)hC^QWex-BVfeWC+&8bHxu2`R@rEgj1K4$$e1lyKZ~{H}d|*yroC!7W~rNW>H_ z$84o+J?{U-jgzaCSi%qw%Ms6&xoz$MW$)YmKPVVWVm<z?VEnrXb{4XAu%%51b?#>m zu^sGp*iQB&+s*!fJ;z>PFTt{~*Hpdm+;#Q5s270n<mw5|U{}lYdIfkmn{vPM`bYT~ zm88p@4R<i<OjS#wAWBXFd9~!$QP=BLS3=$_q)Mnh+q!_zT9-Ia;ucVcgMU>qRX9h) zbzKv)pz8m(s_XLnh9fF8Gyzl<Q=y{tO;OS8xMd_F20ST&*0+djILXPdl7<zxHAxP+ z>#&$<-4g#=qQkUx5y3NW(jvmsB)I8q$UiQ@)w9j3B(%??D+rHAtAkbv@#Tu9tJf=r zrYM@BT(9a9xEOOK3Ei+1Ga)TDVJeoPONZ~1IDZAb?oUz4|KJtRyV>&&ELwCR0B%@> zbb}Wp;DZ*qZx9W#_xU^gC8nXGyBW9Pa`w*7-8=b9=jiY01Z?3#8tlR)*W(krcfRuu z{qXI#eP7Dq>@_wmt`QLg&PN%m1Y3!y;oFW1dGf$B3!lI$u(t(I$3KR7z;dMFfMF;v zedbzT1|_4szbZP^(tc*;$gM|G2aoiKq@Nu;(lye>HKkf3p+^l>Gfe|tmq28tt7<fs zFij_&jYhk2-F7V3-39kM;}~W<7FAUP!51=6#ZAM>WFyh8?p(}Drya{oC6k6?MD$dn zR?^~eTUB+zm48-DD}pExVvSVFF)hbQnnofX)AWdC3PppTEi^@dO4nlXgkdHf2y;>? z!%W0tI8ZH90RhZX6GzJRaLh(BnS!Wv+KP4O!V$s~xp;)L^N87!Dw<6@rkSv#8YYVA zDnijsOAW@{te4@KYN~>n>4XEjJ;2$n<uv2~F>g%6vcds^N{h;As0xmCL=~nL)#Nnh zP)Yk3Cxaj1)40`;eqZSMxj49v%-grG^YGg{5K!Qm>nnO-sll22!Q;LAt!H}ZjVHPf znEQJI`<&}<>IKeTp<Cf_N}D6vNhv<frvhIz>Cw(#@G1YrS3lY2CecR6UL|>n0qT#~ zQIX<*jWgK7jX+(L1Qnb@)%$2Arot;&MRa)2o}-+f^AQrBerm5gx7nWxhyP<R$3n7{ z#Mzy!Ckw)vVHG&0RKaz_Ng{uyENikK!Dh&WpY$M0!K)}^z%nj!GxcOi7KKJFSrY}! zy#ZZ$h<98n=v6`Iz%LW0W&Xp{-4C4ZrZ={CPy4?`Up@La{H98dlj)x}iMlH?D4Nba zaQ3|%f8#&4=ccKA^e7XE-%cWad$r?VSI}d!B3&n4LgcktRB5&LOii7HQ+;?h5}o!j zK*qF-c-ua1Ai<H$subhOKst~W;H1Dx1qx`j5TKo&nnERzO#M<9dw1_{jgMDk7j(pL z5pJvS?dJMh{qW#%P`Fi`2{li~YIQ`+4ICm>ZVas*>nFvG8d^+GXa3MkrP5Y_D_yl_ zkUvX3gUc#*uFJKw)MD?_)lfKf4=wGlEQbe-er~5pevr?XcUFj3pk&TrU4Ps|KZCIy z2yJXG4Jf=S`610WXKC2lnWN%maTK=+uyK=g!q*oslYfhU3(?nB(ziCz%l_I;^!P8I z5?f&}oZTdRaTz>Y_<2+}sf5UY^Rxbk$7#L4|2XxWbGVMJdau8iO1q^_z_SKCmrEWh zP|2h^6*9s<=TOgae?P51?tjS7(u4j7w3#;hAApJGj>~aP94YunYl*&vpTB)2{nI9Y zExo+S|BBf9%crF6KgyPg-xg!=6aNJ49aj%~Zx}nZV@tiWU&{@*zliW+?tY6Ku91GU zG;o?XmdM*K?DvB_xE_lM7he&6GlFg2XkUPY+r7+(w4zo6r;KAcTfJ-Jk|i5=t?rcL zJML&&sh$*K5rx}5y*)8u=mz#=L&t`us$A7Hd4?kd*8m}Gk&(A7<Z&(|b8PdP;@X+Z zs)cB>C&48j+7v^_{)c-gP^p><?^-iVMbQmiK{vfN!k=V!%JS~mF)qgDj!2HIEYbNZ znzbyr;V49+QB`(E!j8qH>tL9MuBlO=(HRoN3N3~<Oasn^lSwLO#EO`@X>!H3L8_{5 zf1|8fx-N9LD;*5X0Eez>I(z{&7PDc<=pvAc)iTsrG!NSG0y~l4ojsPlrF>_6$-lD* zLJ6c3FTTI)d<kpyVXe3`#y1ZWc;wwHlc5Ka@THUs5@N0MNwVR#w-~<cU6d1eJ#e4G z`ySvmcwYeg2+9>9o_4j%EXuRMYbZ~ml(GiHm%WB^94~kS89PzpWgmq+YzB4o6TFZ^ zw}&rVi+0|ACH!bGS_`(Ehu`rr_0rSybH0+l#J|Ij^Ph^cxJ{f?Qp&F@Ym{y3)7tN9 z&uf3Ce_Q{){v-Y8`p1T06pbauwDC>j`-X2O%%Zv2Tw_j|U$f+GyVTC*>?bT4^wQB{ zP-$l|_G(*)gzNv1L$0wHeB@BK0{BI3SOJWaFW^<-TNm4~h8}Kf!xp=Q{S{6QY<R#( znIRm?4B=2_2!}F5IFuQ}8hGz*^M*1%{qK%n{l~_q@-5#yId$*CH5)gyHY}XDYs=Jq xpW&aC3;$L5)GpWx1R+zw|1OgVL^iOySsz=EfTXYeZ_O$MDDpoW%=mvz{{yEz&ddM+ 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 d92883dcfa5..3ae2a0d9791 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,52 @@ -<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 +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata>Generated by IcoMoon</metadata> +<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> \ No newline at end of file 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 GIT binary patch delta 3848 zcmb7HeQX@X6`z^?n7!Tm+OOO5-T88R>${EZ#J&&TtxIgjNuA&rY&U60OVb99#5f?w zPMy#iLvsm55CoM9M<q%r=^rJET4+%zkQP*epoof!K>ulrP>U)-)vBVR0{Txl`eyH( z7$YHdZ|BYXn0fPN=Iw9hE|h*$s3VLJQqXb4p~CbR`%4jxyBsvnLb-PTq1xfZp5H%? z5Ke)-d$xAuFw{|ySuM@Z-F*G~Z{7tgUP4HF|KLpRfY^8H6@-jAP*x9uf}Z344f2mc z?mBqr=+e(n&(k2k4D#8zh5cJ<HyqgiPlU|lpxAe)wsaVcqWeL93*^jv?a)mB>7^40 z#X!W(!wW}_LZI-(8Ob1yd;i{Zn<u-ub042WqZ|}avl*>C8J}TYSV@7cRdar;6ynh! z=w&1!0zZs0?{qiD@R52J+~h?X#<UN+eHa)k%@qeRdkZ7PtL9zu$i{sp<}keGzKt8Q zrZPS?JUlh7nAr{Fn3>(kQ9+>G#;ghE*wmGtcjZ(Jy1;k@XVHJjU&t|(Wf6aRr1~d^ zvcg=^E%XsLU-hanD^{|qC2s^m!t}GE2n9Yj+>c9}H_2Agv9E|?72_a|PCD6m$7e-& zDjFXd-pFkn9*(+KM8cIU2T!&djc(u2sBydMooEPx?!!)2q%JMHBe-0OK`>?tQ*Q`Y z2J$W}n3K)J%2kH2M^o4|Sc7u0RQ0TiW09K@L+iT65*fVU>ir$D4Z0P_1KCW6UbrOq zO_JHeE}1mVR5Cr=t!a^nQSD0ck{}a~xD%;=>Aor@1VAG&4Qp!OxW4f)|75+_53`r; zAjBH+0~TZJFcsM%Ze|NuhKNRRKL+A*IV|$$M}hDn9z72P6Yk6wAe_XVIfHqEdCYNS z^bAKp$@9PE;Q_)?viuTH2_ehN7#<>VFD(-qg<K=(&*=M{Oa6{rG|<q*ZaH5WsKR=g zhS=C4_DHVhxvVt4Ev}bZtm`$N5wEV>6<dX3`s6r=K7!nB74r7PMDwYMiI365gr82A zqX)^a$UE?9cEXgiqG_ZF%Tw42$IM<D(IIGZ?y_x{!8<o;*|x<Bd1r3Yz4P{3?e;s} z$+`d7ai)yhji>2SJ&3AphcQ?w=1$Lwu(L3S&A6Ip84zZh3r3hz1g{9JB^irn6EVw4 z8DXg}%JTuPq}x`yYEoO|<X&A6`6Aa5*D41@LLRX#Gnt9U63w4(5_!pzPL`ddu2Dzk z#NmK^OJFQvXkU#8Lc<8$J(+-@DD2okAE9B+g4uedm}eF89(h@esyM&-szU$nVaI1o zM?W=^!uN@0A(7kCpTsy_+M3I4DI_p2PT%D;E(G?&L_1)rpGRLnUqd&dZ=&1Ly=x|3 zX3KhU6?(X0A@AnJVoPi3HY_)V6%kf1x3yaERtsw^^;LVc#<a?UpGf9%$wWS%cyon0 zG5oy~U(RUSdPBDibr~Np;yMm!YI7;9>*0v5M|Ok_Bg{%}h558*yuM<~`wVo&JdBjf zCH#T>8qe&^*w`|RRHXUj&e|lO3f-#vp2PZLYlyJ1`2T1icU3^^7dccX&!R9S?<m@a zCeSq6jjl%f(0+6f9YTw+9k-$r=nmMBQgs+ZYGuVv40~aJQp}lvK}I`0y^6C&RBhGK z;geEb$1GRCT&|dmctGkcR$y|O5#QX4KP_6!N^T2;LIEihlA0F+!C-(%*rrm4u60QC z6;bNYw1h-!1l5L{6ZomGd;T-UX!CcT=QBVa8iWVxslwnO*%}H=F-M;uo3N+`v_wJ+ zr~pTo_{QFF|2mBO(HrD-avF*3gDA6T33~nHeJ9E3=BuwZ9uN1|x5Mh896LPvaB+m; z9K&b-RBOQ^JLLSgh0%bC7h%yW0BUo^7=uWcTWQw<_Ld940kE~+)*;a958FVwF{fCm zN5h(;Qc;v;C8??1ajTR}mf}{oswF|C$THJf@lw)sb<K%F^GeYP+5wqLf0c}2D6Ohp zx{*`W&QQpp5{1_Yg*sI=XXst3nhpgGP*Qrft6YK3QAg9)8~zBInv&%`Y>1Sq`9mbi zR-6qCDp91W0`05iE<p-NX_%av4u)F3BqJ1radW!ikFaW77LB3j)W-Sf3t81sG31l$ zy}M%v>1vMSv-jWs93dYy32MIiUAV=dCw{5!#XA{V<-^2;Q^$>oMK4w@#{iqFuqQ++ zT(vom)u@;nIi)+MFFC`z`^kei*}o;1D43#i*R;svL}4_a+geJq+szYmdMB<QVE_eg z0sYD)hV^~KF-vJsh;(It+ZzqLRLx)9C{R}N49wj^zMuHl94jWm*8+Q2@u_t&DS&aH z`M?N)%$mOE;Ly;)d#3$*7ck?;_5tMa5}z1M(g+Qxydd)tp2Gqk=6L}VEN}u52`@`l zsAp$9+ZEvyB81_b;4l{^VIdljA{2UqZ08#fnaTRl+y=}MC9V*jh_(#JX;cm>9kM70 zVpI&K6)H+{k!oSh;`vZQmzDAHP>4pV0q_w?h2=nqmu(o6`M|jM#!V2Vhme3iL_gqU z@;023Hk`&+0@5RFh`l(Q2T-YQ!lhUzF4tEy`L@P#;gVxv2bQ(fbQK5SueNZgq5>>& z06sRLyb3404M)6+A629v4Z<raZzvM{FmRI6={~Tla|z4ic3g?u*JUjwp4}lSiiF>- zvnn5yns-RSpoEvDAo&hcjWKcT68C84nbEFm@MGz?ZO79ssz^=E@Aa;vG`INvGK@Cg zLKJ-fvsc=)FTqK7EkNrnumWu`h3Wg)T6fGf8YgG3!CShvh3j9WSVqBxz`txkHkIM7 zT!L!?9L+6MW*0?TTsZ|T$Si#FIE&9Gdl|P^ssqJ`oB!~mw;0X8$LM=hQRpAlb&-kb zT(`GP)3$l*b9m~CXja2_Q>*MrkwB=@^O`phm%1xKDN0EX^XEHNPAk$2j0FPhiuQ~m zJ<qg2e#7xw^YLChGMY*a^~UpCA&I|1!<vh6tUB##VOou0?Eh<kFYrsnZ_Qp48TtSz zJbaD_AosB|D|O>Q%p-k#<A<@I*TMQBln?wyGBQva?Lv>EKj0pG48KTXq>BuaJ>)iW zmJ_+{+#+|JdzjxRM1_n{68<J!fP_zr8^p`R-Qv9X6Y*v70_~wgbc$Y2kJAU~FQl(X ze+n#vcZLdm=su+SBN3k>)OgN{*O`i$*<F;PU$=P<n(l7%Jn-k+ya0a&%WYl+{he)I zMhQ&d0*d(nXtH2w@dS?T=i597`k6M*1OFD|GtfbR|8FC0g9wHP+PsVgaH{cIyln58 zSv+#X!hELKS3rBf$s#&}Za@oY9%WDwW>#RWSTT3a%-%FtTZDC-L9^&4G>2+vky-NF z7v_&<W@qMS7Hdam4rH#oIkRK`!sNojd>`8GyE+QaW*e0bSLlP);2O1#B>Ok`KgM!K A>Hq)$ literal 6524 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 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 GIT binary patch literal 6252 zcmbVQ4UiK@cJ9|B&5Weg&uAo#RuYS(ku>IScO@YWHtY`=<K49Z!vS}WFZdR-2j*4_ z2RL41p93!cKm}KPKvMp>!ntznPzF<1NyV&_tAKsZ6<2p<$0T+B0Vh{UOcEzJzLf1$ zU76W@J<=`<uJTpfntuJ>>(}pf_v@e6x_9-86^s~Ca+C$!GTWpDesx;?wXO<dq=Ne` zk;75x=DQlhJHXotdY#Cr4Zrx&mf>B3_hZmPR^-T*(fhs)-s_A-KN0zp3kTTNk>SmZ z#U@Z+7g_Fn_UBu{1n*<e1(B6A(tmGl>>g(<9s@08Cr+}tr$)Em1-bYyKyMWJ?#*|7 z*ccv%-Nby*SvU8yBV)sj5%6w>ZAav;7smJP*uHBw#tU9cP68%LpU@M`%NT!(3$1_H zEa^X4m3*LQCW_3Y1m4fs#W~WM$uq29LI#JBr&88MTr0pbs1tYwP)KE%hb=<s$4qhj zh-EL%nY=tX2_6H^T%0EVCFN<ga4P_a5v0PdmL`ugW?%1`zGDBk@F>szm;WPwkmaGU zBr73OI?3uJAV!B&UPR*S?&Ws9Wbx-0Y>bmc_~IKE%+JRI1FL#^Rt*H=`T6|8cz%JT zc)g0WARk9{V%4p-ee0?OnxJ!hhMoT3ZpjEqWvjcBTcx^PPZ)`cQLos&=n*Mj)`_6+ z`kpST^ey%qX)||AgfyZyimWvA$@VYn;Ion5o(0l^o}P$xOE^@^OGx>8B(g#*Cd~TV z?2I&rp8=*~zL}45q?@&B+%mhU8do@T-sWqax3hhH;cSc#>imoYPddGo%I%L24nFRV ze~^6q6u+0vVoNaoPBQbdVkuRtm#UQn1{TkdVlScE!jgr#H}fSpp|*r<B}4I;5U7?b zb=#<!2EQk@WOiYBDofify{kPjUpJDpFrRJLyRQ(gNIJj6;w$6vOuA#soM<#0j@2_B z)$8XHw}vwRr8hZVA2?pY5t6xW*P*`(+3XDe8OEGpIaXrxSU0P&8_;vhtaXtYrntz} za#gFAb1tmbEUOwfYkE%0X?m`fiz{ZlTB}Y2{)&D}o3TCFHl%BMv_Pz&M<XAPjh&jr z5-vCsG;qF97%CPAi$(rj*@_2)aZJVS&M6xFx;C#^bOx#5T%bV+op%%ZN$fm3CKdTR z=%JX^d1CEiYQygQ%8A*e$YTBUiM3P31ol!F0a#LzWY3%Z03Mn8-vl5o9a{<@snW4y z<l*EYN#gy-Bo3y>^S2%(07>C{e(F&;=X>@L5?7_4?%@iyG-vO!rzDI28?)F#^rqIu zZ7U3Wm?=w{O_;CQTrv7+HdXt$VRum<dGn>(!a7z!JSLlx<r~n8-M$;UX5E<XT-EK( z>uauXq-2ZbyldIEB{KcVjnmvUQ!S@C(@lGu(w2=*(K_19Pw)(S%gC^4-3bsA;$TJH z4=K&><ReT0VJU`U*kyj_(aa+U(ofNA&!r9=Odo}u#P+ghq`mwDoLoK@VoZ<2+nVsW z3-(IvGK89$e=s!UygW2C$%cl|mebAbY5oeo$RgMYjPi0k*1^RAgN1L#XU+y^D@Sj* z=>~kGD~(*v5Sd>bU1>e`@bK`%k69~6|0kCe%w&!+8SCH&SO@>w>XXirLchBVi=ulZ zy5|Bx#a(co7?$3UfX>TTa2FFb7ahlGG%im}PSRkbajMZc)M&V4ILOZP-TZmhCT=cw z3<<0)F#<g=W9!1DeN-=rEgllP7nN{vn5GCJ$(JYdsf1x>Vj;CN;_>*Tik>q%>Tx9} zOa6JfSN4>p_GGlSS?2utoDolFlZljbe6j3N4RwFjOzVp2m*gIw|9;={R4n?<u-6NJ zoQH3U)4plWLmn#<N10x&neoL0U}IyNG)=lZ@73h_!-vlwIdb9fVQ27*7+-t1nVjz* zaTBCP!Wv4ji~K|WG)rM-6l}DGom>e?2E1%n61LG@viVs#qEV@DeRtQo9@9nQrv7Yi zh7QT`?o@GUSDL7!vaDEK+MObgy!wENeSV2fN;;i`f8kZQ?-DOvevi%-3a}}&f9Jp9 zPl~ljAqmH-(JR>&zjXbk)r<A}>gR&?ts55x`IF|#f&Rpu^L}Y=YV7FlfGct9o@0+l zbNO%J%XWD4Ms^$fUAB$g%N}Omzs9#!u~?@aJy$Asm#mUpZgLGhhefQw=~r!OW9Evs zXA)nfhW;X5ET&VXQtHAKvajcl_I)E8jb0bijhMEFHph}W`J$RL9@6ztSl7dYp;#;= za&ZdzB4=Q#s^lVQNgfy~7E`Vrx1^CZ*&G?MSSIZJ<(lD@o=oro-BldYcQ!4AVmtpo z9L&FlK;?Cb@gKu?vsgd7i4C#Uh$U}FTz41S${K7ZeDMI=#~y_@D)k=1*2&AW2#&~I zO%~(0L~)9`lWb#=UrpjtGTp1m5*HGxtF^cQ_B7@dn0sBhwexVjT}v85gg@j927PKU zs5+nf+S+`AqMV|(>(O>q`MIpNN24iK8Rl%b#~GrRziYc`m4MFAY}-Wuey|7$<*G%C z__CmHmC$n)SWL3!i>6XhpN8vc2JYNUuQ+35I`5yb?XTJPbBh)|=OVWWmA5tRf$!E} ze{`|;_*?u1oRZj+RWU5i-r9d?KYzh_<Be<TF?Q3i`QV}bZ@oqDyzz#Ez**dFFSBuJ zxfEb4;15<5u~{dTd&ONULKZh>Y+k)0gmk}V*n)d^`s%g25y(j8gt&$+X-cjc>ois1 z<V0QbYsN**_He8sEjP=xNGKZ66j}EB1L>$XCuvmD=}OX=qeatT1^j-&HIkKd+|r|F z1md-_*_QM974@IgSX;0|(+Ya5sA;o;!I+{d_+r7}EKMuM^n#{!1lwX@D#}EmDr`l} zsD53{wGh=ZO$!+<>RL!ujij&(qq3}M0f^VD1+VH;J1{h@qb=A}rN)A7Fk94Pu7Me5 zMQ37qQG;7(fK)!g$HglQcW?9dHE@Vc%zEaTsgK_=g@J`OGw*8~P0F~?fB8t}sQ;-n zy>=k=obPBFzPtL)S8|-4pl{&P7k(w$Pf<S3$J}^8vuXdwe9ZaNlV7YeG}O_Vlk`nd z$Js~hv=rs9;ym^<W>+;+Bg6of{n6kcFE|4<apcHp&M!NNgD*UB#MQ?xv6m#B|Ghg# zY)1{}xK`D2l0M0b&LmM0PnvT?&SXJQqK(8R$tMxw<|xaGHzA3*(ul*JC~~#3R+e%Y zdku4CBVIJH6D^4@qrFI+mO2lNr|!9sqSyAM#+~ocL#Kbj*B0A3`J4+rqEt}?mE-OA zTza>izxLUl_HinlKFuV=zvmGDo}7wtieiLCY#mc^$7(kkRBSX3kByz9LFd#VB)Z_B zgNQ}0Y1@iLTn)Nt>=kMZ@qlo3xjcfxVi6P2XduA7Fg6Cl)l4NZ7e@{qY77h%g$bH) z8gv+TuD)waAs$DlYbE5eov2q6h^Xq=q+IP@-&Z0nB4>J^)y=p|nLX>e_|uf`T3SqX z$7S=tYS}}n?*3A7S*63BccMFJm_N^Fi#IXiL`*E_SW$nLrVp{eo@=hFnKF<-K<YGQ z{&-r3t)DzC9hXjv{{hJIkwWmebex<G&IY1Khv>y^blh3LjUM^@326uJdCt~Kjx-mM z4DNZV`p87o#`z`ZgR`{BIeM1Tmvye->^tHdA@h)!2ees-HuFUr%8}`#D&^vmb6KbK zS?4HiI_rGEFVVfu`!q_U&iiOYGyA0*KC%gpSx@vLe$JjD`iE`KdOE(%xnJ7x`4eKj z?_*1)-<SGWjO{}6JZ2jqO|>Ed*G_K6D;;3S%G5d7IuLQ1)l1U{8kn_`2otUDQWtk0 z+eSjhJ%ux_=0aoo@C0H)d|@xgS-tw;)+I}}9$Y<D4m`LKfrdx*q!y)>u;SA^UcV>o zk;v-_c|2aMdavZ=GWYmZBRF?WGG7Qw0qzYU0F_7z@sKy-Q^N{cgU*%gjSmh;eKQRR zLj}QJGCH3m9!Lhbhs!xXc2vaQ7HId&UauUH+d2Y@toqAJG!!*Fo?uG%2L=X$K_y)G zL3210^811we-1qnI*8_NTa3Qr9pYu5Ax`xpPL1GwX|Y=obuo&`^C(}!9baEemBcKn zPBBU?hT)!!WMZnDk~1*GVOldPsA&iiB!mJv!~z<gS2?_|G&&Jb+mtqZYT&(qiXQ<} z1GB6r*UlOz|3EGoNai->jX*L#s0IQmeI#J1O?4hs+uBsxqqgzK1#7t=mtVn7WdFLq za3{Ugk<8_i9ZeWeov7OiN}Q#xx~zcCukgD16k`vx#$G|p`7Ojb_hbC6$OeON20HO; z8O7W+v5#`CgylYS#Tvuo!+i>4eO2)vP6baAMBvQ`N&M@el&8W`18a@;?-kv1!5so~ z0qt=9!|l5vVCmNa{#pqHl()6n;i1*VIrdG_=uP%@MOt-BBp;<eP>iarhJC@>+`qFI zCe=B$HZ`K~xh-|j`9eVbiO>Q7bjs4PfcmQ70{o5SSyoEUquxwr$-HD~8CLc0DWRx^ z)2_bSiiVVW0#}1Lq>#T}{@#{5!%IG80Xz$k-rE1tu`4A`9tS6n_zx1VT{oeP`#+s{ zMj%O!tI5S%ptD)iq(n0hc6&3kw^0rv+mJbr{4Vfy$Ug+W7v;@OJ{@e836z(>mr<TW zDRgx;GkY2305aOTI`*SPW*;@%uu0Ic<7VigJDQoTM?G(4f$u~94Ea;H$9|ko9c(T8 z5j#h7=|Os(CwPG`;v4uwd_t0?71B;=uXNP2(Hrq*y%q02dq2lM?vUrpH^}ScG5JOL zto*q$S6QO0QogP1Ri0M<T>TyO9p4^k7jxdp4l#r)NK-TF5-kv7CtLGLu9RpYBo+2o zExrW)x)$yM{$>mJA||M|a2fo^TDYI3h$9Lhj}M$YYMMC5d*Rg<E`dMN!acx$)xy0j z!FpS`4E~cX+|L$LX4&ZQ*moAJ+d9%1Sul9l_OV@T85?E8Y>a(}EkGByLS+Ma0UN|a zWIOn~HjM1tb@%qMY`L?WZ9vsd+yr;KRasWX%yfSRonN8J+L0~yj1KRFlSkMVc8}ZZ zonJxEitS^&vs*^SMs^PG9@(7TbYB+puyXtMu};MJV!*pu76wLuiLnlY9$}lo+r;hz UY);EcNDA3b_*wj`{Uz!D00Rsr(f|Me literal 4976 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 U9#VlklKxgqnGXU-{9mts0SLn#=>Px# 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 GIT binary patch literal 3060 zcmV<Q3k&pjPew8T0RR9101Na03jhEB02mYi01K!90RR9100000000000000000000 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 CC%BIQ literal 3236 zcmV;V3|sSePew8T0RR9101Tu63jhEB02y!q01Q<C0RR9100000000000000000000 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 WV=x-dNR%b4oyRE>boVqE0000qza{1X diff --git a/lib/web/fonts/Blank-Theme-Icons/selection.json b/lib/web/fonts/Blank-Theme-Icons/selection.json index 307b07ce972..e3a71a30c6a 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 -- GitLab From 49aae9d6ac0384907acf6922a2df0e52951ef52b Mon Sep 17 00:00:00 2001 From: Kateryna Muntianu <kmuntianu@ebay.com> Date: Tue, 26 May 2015 15:59:49 +0300 Subject: [PATCH 017/396] MAGETWO-37152: Permissions set for a category for "All groups" + a specific group: returns an error, but saves settings - Added correct handling of NULL values --- .../Framework/Model/Resource/Db/AbstractDb.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php index ba80e64a256..c429eabbd97 100644 --- a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php +++ b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php @@ -640,13 +640,12 @@ 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))); - } - } else { - $select->where($unique['field'] . '=?', trim($data->getData($unique['field']))); + if (!is_array($unique['field'])) { + $unique['field'] = [$unique['field']]; + } + foreach ($unique['field'] as $field) { + $value = $data->getData($field); + $select->where($field . '=?', $value === null ? new \Zend_Db_Expr('NULL') : trim($value)); } if ($object->getId() || $object->getId() === '0') { -- GitLab From 2a5432564e7fab80ca09daf93b42e9a0a9ec290b Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Tue, 26 May 2015 16:37:27 +0300 Subject: [PATCH 018/396] MAGETWO-36023: [UI] Shopping Cart: Gift Wrapping and Gift Messages - Code formatting --- .../web/css/source/module/_cart.less | 511 ++++++------ .../web/css/source/_module.less | 27 +- .../web/css/source/module/_cart.less | 778 +++++++++--------- .../web/css/source/_module.less | 27 +- .../web/css/source/_module.less | 243 +++--- 5 files changed, 790 insertions(+), 796 deletions(-) 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 6a6213c7e1b..8e6e2754c48 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 @@ -9,329 +9,328 @@ & when (@media-common = true) { -// -// Shopping cart -// --------------------------------------------- + // + // 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; + .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( + display: block; + .heading(h3); + } + .block { + margin-bottom: 0; + > .title { + border-top: @border-width__base solid @border-color__base; + cursor: pointer; + display: block; + font-weight: @font-weight__semibold; + .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); + ); + 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: none; - } - &.active { - > .title { - .icon-font-symbol( + > .content { + display: none; + } + &.active { + > .title { + .icon-font-symbol( @_icon-font-content: @icon-prev, @_icon-font-position: after - ); + ); + } + > .content { + display: block; + } } - > .content { - display: block; + .item-options { + margin-left: 0; } - } - .item-options { - margin-left: 0; - } - .fieldset { - margin: 15px 0 25px 5px; - .field { - margin: 0 0 @indent__s; - &.note { - font-size: @font-size__s; + .fieldset { + margin: 15px 0 @indent__m @indent__xs; + .field { + margin: 0 0 @indent__s; + &.note { + font-size: @font-size__s; + } } } - } - .fieldset { - .methods { - .field { - > .label { - display: inline; + .fieldset { + .methods { + .field { + > .label { + display: inline; + } } } } - } - .fieldset.estimate { - > .legend, - > .legend + br { - &:extend(.abs-no-display all); + .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 { - font-weight: @font-weight__regular; - } - } - .amount { - padding-right: 4px; - text-align: right; - strong { + // Totals block + &-totals { + border-top: 1px solid @border-color__base; + padding-top: 10px; + .table-wrapper { + overflow: inherit; + } + .mark { 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); - } - } - - // Products table - &.table-wrapper { - .items { - thead + .item { - border-top: @border-width__base solid @border-color__base; + .table-wrapper { + margin-bottom: 0; } - > .item { - border-bottom: @border-width__base solid @border-color__base; - position: relative; + .table-caption { + &:extend(.abs-no-display all); } } - .col { - padding-top: 20px; - &.qty { - .input-text { - margin-top: -5px; - &:extend(.abs-input-qty all); + + // Products table + &.table-wrapper { + .items { + thead + .item { + border-top: @border-width__base solid @border-color__base; } - .label { - &:extend(.abs-visually-hidden all); + > .item { + border-bottom: @border-width__base solid @border-color__base; + position: relative; } } - } - .item { - &-actions td { - padding-bottom: 10px; - text-align: center; - white-space: normal; - } .col { - &.item { - display: block; - padding: 25px 0 10px 75px; - position: relative; - min-height: 75px; + padding-top: 20px; + &.qty { + .input-text { + margin-top: -5px; + &:extend(.abs-input-qty all); + } + .label { + &:extend(.abs-visually-hidden all); + } } } - } - .actions-toolbar { - > .action { - &:extend(button all); - .link-as-button(); - margin-left: @indent__s; - margin-bottom: @indent__s; - &:first-child { - margin-left: 0; + .item { + &-actions td { + padding-bottom: @indent__s; + text-align: center; + white-space: normal; + } + .col { + &.item { + display: block; + min-height: 75px; + padding: @indent__m 0 @indent__s 75px; + position: relative; + } } } - } - .action { - &.help.map { - &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; + .actions-toolbar { + > .action { + &:extend(button all); + .link-as-button(); + margin-bottom: @indent__s; + margin-left: @indent__s; + &:first-child { + margin-left: 0; + } + } } - } - .action-gift { - .button-icon( - @icon-down, - @_icon-font-size: 32px, - @_icon-font-line-height: 16px, - @_icon-font-position: after - ); - &._active { - .icon-font-symbol( - @icon-up, + .action { + &.help.map { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } + } + .action-gift { + .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 + ); + } } - } - .product { - &-item-photo { - display: block; - max-width: 60px; - left: 0; - padding: 0; - position: absolute; - top: 15px; - width: 100%; - } - &-item-details { - white-space: normal; + .product { + &-item-photo { + display: block; + 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; + } } - &-item-name { - display: inline-block; - font-weight: @font-weight__regular; - margin-top: -6px; + .gift-registry-name-label { + &:after { + content: ':'; + } } - } - .gift-registry-name-label { - &:after { - content: ":"; + // 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 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-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); + .product-image-wrapper { + &:extend(.abs-reset-image-wrapper all); + } + .action.configure { + display: inline-block; + margin: 0 0 @indent__base; + } } - .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%; + &-container { + .form-cart { + &:extend(.abs-shopping-cart-items all); + } + .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; + } } // @@ -358,7 +357,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; @@ -397,8 +396,8 @@ } } &-summary { - position: relative; float: right; + position: relative; width: 23%; .actions-toolbar { .column.main & { @@ -432,11 +431,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 84c3626f37a..c78983da92d 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 @@ -15,7 +15,6 @@ // _____________________________________________ & when (@media-common = true) { - .gift-message { .actions-toolbar { .action-cancel { @@ -78,6 +77,7 @@ } .title { + border-radius: 3px; .button( @_button-margin: 20px 0 0, @_button-padding: 7px 15px, @@ -88,7 +88,6 @@ @_button-icon-font-line-height: 16px, @_button-icon-font-position: after ); - border-radius: 3px; font-weight: bold; &:active { .css(box-shadow, @button__shadow); @@ -113,14 +112,14 @@ .block-order-details-gift-message { .item-options { dt { - margin: @indent__s 0; font-weight: @font-weight__regular; + margin: @indent__s 0; } } &:extend(.abs-add-clearfix all); dt { &:after { - content: ""; + content: ''; } } .label { @@ -142,15 +141,15 @@ } } .action.show { - padding-right: @indent__base; - position: relative; .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 + @_icon-font-content: @icon-down, + @_icon-font-size: 22px, + @_icon-font-text-hide: false, + @_icon-font-position: after, + @_icon-font-display: inline-block ); + padding-right: @indent__base; + position: relative; &:after { position: absolute; right: 0; @@ -158,8 +157,8 @@ } &.expanded { .icon-font-symbol( - @_icon-font-content: @icon-up, - @_icon-font-position: after + @_icon-font-content: @icon-up, + @_icon-font-position: after ); } } @@ -186,8 +185,8 @@ } } .gift-item-block { - border-top: @border-width__base solid @gift-item-block__border-color; border-bottom: 0; + border-top: @border-width__base solid @gift-item-block__border-color; .content { padding-left: 1.5rem; padding-right: 1.5rem; 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 b7994299e80..6d797af3427 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 @@ -13,457 +13,455 @@ & when (@media-common = true) { -// -// Shopping cart -// --------------------------------------------- + // + // 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); + .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); - .title { - strong { - .font-size(14); - font-weight: @font-weight__semibold; - } + // 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; } - .item-options { - margin: 0 0 16px; - .field { - .radio { - float: left; - } - .radio + .label { - display: block; - overflow: hidden; - margin: 0; + + .block { + form:not(:last-of-type) { + .fieldset { + margin: 0 0 @indent__m; } } - } - form:not(:last-of-type) { - .fieldset { - margin: 0 0 @indent__m; + .price { + font-weight: @font-weight__bold; } - } - - .price { - font-weight: @font-weight__bold; - } - .field { - margin: 0 0 16px; - &.note { - display: none; + .field { + margin: 0 0 16px; + &.note { + display: none; + } } - } - .actions-toolbar { - > .primary { - text-align: left; - .action.primary { - &:extend(.abs-revert-to-action-secondary all); - width: auto; + .actions-toolbar { + > .primary { + text-align: left; + .action.primary { + &:extend(.abs-revert-to-action-secondary all); + width: auto; + } } } - } - .fieldset.estimate { - > .legend, - > .legend + br { - &:extend(.abs-no-display all); + .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; + } + } } } - } - - .page-main & { - .block { - margin-bottom: 0; - } - } - .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: 6px 0; + text-align: left; + } + .amount { + border: 0; font-weight: @font-weight__regular; - padding: 3px 0 0; + 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: 0; - padding-left: @mobile-cart-padding; - padding-right: @mobile-cart-padding; - white-space: normal; + .item-actions { + td { + padding-bottom: 0; + padding-left: @mobile-cart-padding; + padding-right: @mobile-cart-padding; + white-space: normal; + } + .actions-toolbar { + &:extend(.abs-add-clearfix all); + padding-bottom: 15px; + text-align: right; + } } - .actions-toolbar { - &:extend(.abs-add-clearfix all); - padding-bottom: 15px; - text-align: right; + .item { + .col.item { + display: block; + min-height: 75px; + padding: 15px @mobile-cart-padding @indent__s 90px; + position: relative; + } } - } - .item { - .col.item { - display: block; - padding: 15px @mobile-cart-padding @indent__s 90px; - position: relative; - min-height: 75px; + .action { + float: left; + margin-right: @indent__m; + &:last-child { + margin-right: 0; + } + &.help.map { + &:extend(.abs-action-button-as-link all); + font-weight: @font-weight__regular; + } } - } - .action { - float: left; - margin-right: @indent__m; - &:last-child { - margin-right: 0; + .action-edit, + .action-delete { + float: none; + .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 + ); } - &.help.map { + .action-delete { &:extend(.abs-action-button-as-link all); - font-weight: @font-weight__regular; + .icon-font-symbol( + @_icon-font-content: @icon-trash + ); } - } - .action-edit, - .action-delete { - float: none; - .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 { - &:extend(.abs-action-button-as-link all); - .icon-font-symbol( - @_icon-font-content: @icon-trash - ); - } - .item-gift { - &._active { - border-top: @border-width__base solid @color-gray-light5; + .item-gift { + &._active { + border-top: @border-width__base solid @color-gray-light5; + } } - } - .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; - } - - .cart-tax-total { - &:extend(.abs-tax-total all); - &-expanded { - &:extend(.abs-tax-total-expanded all); + .product-item-name + .item-options { + 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); - > .title { - strong { - color: @color-blue1; - font-weight: @font-weight__regular; + .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; + } } - .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 // _____________________________________________ @@ -471,22 +469,22 @@ .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, @@ -603,16 +601,14 @@ // _____________________________________________ & when (@media-common = true) { - // Cross sell .block.crosssell { - padding: 0 @mobile-cart-padding; margin-top: 70px; + padding: 0 @mobile-cart-padding; .product-item-info { width: 200px; } } - } // @@ -650,9 +646,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; } @@ -709,11 +705,11 @@ .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; @@ -748,9 +744,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%; @@ -772,9 +768,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 f044c57acf3..5acfdc4abeb 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 @@ -23,7 +23,6 @@ // _____________________________________________ & when (@media-common = true) { - .gift-message { margin-bottom: @indent__m; .actions-toolbar { @@ -113,9 +112,6 @@ .title { color: @gift-item-block-title__color; cursor: pointer; - margin: 0; - padding: @indent__s @indent__xl @indent__s 15px; - position: relative; .icon-font( @gift-item-block-title-icon__content, @_icon-font-size: @gift-item-block-title-icon__font-size, @@ -126,6 +122,9 @@ @_icon-font-position: after, @_icon-font-display: block ); + margin: 0; + padding: @indent__s @indent__xl @indent__s 15px; + position: relative; } .content { @@ -143,15 +142,11 @@ .order-details-items { .order-gift-message, .block-order-details-gift-message { - .item-options { - dt { - margin: @indent__s 0; - font-weight: @font-weight__regular; - } - } &:extend(.abs-add-clearfix all); - dt:after { - content: ""; + dt { + &:after { + content: ''; + } } .label { &:extend(.abs-colon all); @@ -159,6 +154,12 @@ .item-message { clear: left; } + .item-options { + dt { + font-weight: @font-weight__regular; + margin: @indent__s 0; + } + } } } @@ -197,8 +198,8 @@ } .gift-item-block { - border-top: @border-width__base solid @gift-item-block__border-color; border-bottom: 0; + border-top: @border-width__base solid @gift-item-block__border-color; .title { &:after { .font-size(12); 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 0d88f1f7d94..9ce1e4755eb 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 @@ -8,142 +8,140 @@ // _____________________________________________ & 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; + } } - &:after { - content: ")"; + textarea { + margin: @indent__s 0; + } + .input-text.qty { + margin-bottom: @indent__s; + } + .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 // _____________________________________________ @@ -161,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); @@ -279,8 +277,8 @@ margin: @indent__s 0 0; > * { display: inline-block; - margin-top: 7px; margin-bottom: 7px; + margin-top: 7px; } } .fieldset { @@ -308,7 +306,7 @@ } } } - .wishlist-index-index { + .wishlist-index-index { .product-item-info { width: auto; } @@ -318,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); + + border: 1px solid @color-gray-light2; + border-top: none; + .css(background, @color-white); + .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; } @@ -344,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; } -- GitLab From 08ec63970ba03f7a9f939064bc468e14e09e72ed Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Wed, 27 May 2015 17:47:14 +0300 Subject: [PATCH 019/396] MAGETWO-37152: Permissions set for a category for 'All groups' + a specific group: returns an error, but saves settings --- lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php index c429eabbd97..4aa6000c6d6 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) { -- GitLab From 856352dd9bab782bfbc881320e38e9e01ed6103d Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Wed, 27 May 2015 18:22:30 +0300 Subject: [PATCH 020/396] MAGETWO-36826: Unable to update stock items of product using API service --- app/code/Magento/CatalogInventory/etc/webapi.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogInventory/etc/webapi.xml b/app/code/Magento/CatalogInventory/etc/webapi.xml index 80317eccf51..fe200c8628c 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"/> -- GitLab From 4451194124e7eddd2ba82bb4989c76ceda360905 Mon Sep 17 00:00:00 2001 From: Oleg Zinoviev <ozinoviev@ebay.com> Date: Wed, 27 May 2015 19:42:55 +0300 Subject: [PATCH 021/396] MAGETWO-37890: Product options are displayed not styled on "edit Product from Wishlist" Frontend page --- .../blank/Magento_Bundle/web/css/source/_module.less | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 72714b88fe0..bd3627dbed2 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 @@ -97,11 +97,11 @@ .nested { .field.qty { .label { + .css(font-weight, @form-field-label__font-weight); + .css(margin, 0 0 @indent__xs); display: inline-block; - font-weight: @form-field-label__font-weight; - margin: 0 0 @indent__xs; } - margin-top: @form-field__vertical-indent; + .css(margin-top, @form-field__vertical-indent); } } p.required { -- GitLab From 8bd7a42d49816922bf3ac0a869c8a75ca37f0456 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Thu, 28 May 2015 09:43:50 +0300 Subject: [PATCH 022/396] MAGETWO-36023: [UI] Shopping Cart: Gift Wrapping and Gift Messages - CR changes --- .../view/frontend/templates/cart/form.phtml | 7 ++-- .../view/frontend/templates/form.phtml | 10 +++--- .../web/css/source/module/_cart.less | 4 +-- .../web/css/source/_module.less | 9 ++--- .../web/css/source/module/_cart.less | 12 ++++--- .../web/css/source/_module.less | 36 +++++++++++++------ .../web/css/source/_module.less | 4 +-- 7 files changed, 51 insertions(+), 31 deletions(-) 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 dcbf1bf3667..c6872ecc092 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -88,10 +88,13 @@ <div class="actions-toolbar"> <div class="secondary"> - <button type="submit" class="action action-edit" title="Edit"> + <button type="submit" + class="action action-edit" + title="<?php echo $block->escapeHtml(__('Edit')); ?>"> <span><?php echo __('Edit'); ?></span> </button> - <button class="action action-delete" title="Delete"> + <button class="action action-delete" + title="<?php echo $block->escapeHtml(__('Delete')); ?>"> <span><?php echo __('Delete'); ?></span> </button> </div> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml index e04693e2704..ee99ef0e45f 100644 --- a/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml +++ b/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml @@ -26,7 +26,6 @@ <div class="control"> <input type="text" id="gift-message-whole-to" - title="To" class="input-text" name=""> </div> @@ -40,7 +39,6 @@ <div class="control"> <input type="text" id="gift-message-whole-from" - title="From" class="input-text" name=""> </div> @@ -55,7 +53,6 @@ <textarea id="gift-message-whole-message" class="input-text" - title="Message" rows="5" cols="10" name=""></textarea> @@ -64,10 +61,13 @@ </fieldset> <div class="actions-toolbar"> <div class="secondary"> - <button type="submit" class="action secondary action-update"> + <button type="submit" + class="action secondary action-update" + title="<?php echo $block->escapeHtml(__('Update')); ?>"> <span><?php echo __('Update'); ?></span> </button> - <button class="action action-cancel"> + <button class="action action-cancel" + title="<?php echo $block->escapeHtml(__('Cancel')); ?>"> <span><?php echo __('Cancel'); ?></span> </button> </div> 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 8e6e2754c48..91cef0e31cb 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 @@ -29,12 +29,12 @@ > .title { border-top: @border-width__base solid @border-color__base; cursor: pointer; - display: block; font-weight: @font-weight__semibold; .icon-font( @_icon-font-content: @icon-down, @_icon-font-size: 30px, - @_icon-font-position: after + @_icon-font-position: after, + @_icon-font-display: block ); margin-bottom: 0; overflow: hidden; 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 c78983da92d..4df2ee07bd1 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 @@ -9,6 +9,7 @@ @gift-message-field-label__color: @color-gray40; @gift-item-block__border-color: @color-gray-light5; +@gift-item-block__border-width: @border-width__base; // // Common @@ -88,7 +89,7 @@ @_button-icon-font-line-height: 16px, @_button-icon-font-position: after ); - font-weight: bold; + .css(font-weight, @font-weight__bold); &:active { .css(box-shadow, @button__shadow); } @@ -96,7 +97,7 @@ .content { &:extend(.abs-add-clearfix all); - border-bottom: 1px solid @gift-item-block__border-color; + .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); display: none; padding: @indent__s 0 @indent__base; position: relative; @@ -112,7 +113,7 @@ .block-order-details-gift-message { .item-options { dt { - font-weight: @font-weight__regular; + .css(font-weight, @font-weight__regular); margin: @indent__s 0; } } @@ -186,7 +187,7 @@ } .gift-item-block { border-bottom: 0; - border-top: @border-width__base solid @gift-item-block__border-color; + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); .content { padding-left: 1.5rem; padding-right: 1.5rem; 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 6d797af3427..f33e5904dca 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 @@ -95,10 +95,12 @@ .radio { float: left; } - .radio + .label { - display: block; - margin: 0; - overflow: hidden; + .radio { + + .label { + display: block; + margin: 0; + overflow: hidden; + } } } } @@ -604,7 +606,7 @@ // Cross sell .block.crosssell { margin-top: 70px; - padding: 0 @mobile-cart-padding; + .css(padding, 0 @mobile-cart-padding); .product-item-info { width: 200px; } 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 5acfdc4abeb..b3755edb0a1 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 @@ -10,6 +10,8 @@ @gift-message-field-label__color: @color-gray40; @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; @@ -46,6 +48,14 @@ } } + .cart.table-wrapper { + .item-gift { + &._active { + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); + } + } + } + .gift-options { &:extend(.abs-add-clearfix all); } @@ -99,18 +109,18 @@ // --------------------------------------------- .gift-item-block { - border-bottom: 1px solid @gift-item-block__border-color; + .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); margin: 0; &._active { .title { &:after { - content: @gift-item-block-title-icon__active__content; + .css(content, @gift-item-block-title-icon__active__content); } } } .title { - color: @gift-item-block-title__color; + .css(color, @gift-item-block-title__color); cursor: pointer; .icon-font( @gift-item-block-title-icon__content, @@ -156,19 +166,23 @@ } .item-options { dt { - font-weight: @font-weight__regular; + .css(font-weight, @font-weight__regular); margin: @indent__s 0; } } } } - .order-details-items .order-items .order-gift-message { - &:not(.expanded-content) { - &:extend(.abs-hidden); - } - .action.close { - &:extend(.abs-no-display all); + .order-details-items { + .order-items { + .order-gift-message { + &:not(.expanded-content) { + &:extend(.abs-hidden); + } + .action.close { + &:extend(.abs-no-display all); + } + } } } @@ -199,7 +213,7 @@ .gift-item-block { border-bottom: 0; - border-top: @border-width__base solid @gift-item-block__border-color; + .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); .title { &:after { .font-size(12); 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 9ce1e4755eb..c1388fd10a0 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 @@ -318,9 +318,9 @@ .product-item-inner { @_shadow: 3px 4px 4px 0 rgba(0, 0, 0, .3); - border: 1px solid @color-gray-light2; - border-top: none; .css(background, @color-white); + .css(border, @border-width__base solid @color-gray-light2); + border-top: none; .css(box-shadow, @_shadow); display: none; left: 0; -- GitLab From 5857e4d061f3ce7531183218f1262fe5a61a6b4a Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Thu, 28 May 2015 10:48:01 +0300 Subject: [PATCH 023/396] MAGETWO-36023: [UI] Shopping Cart: Gift Wrapping and Gift Messages - CR changes --- .../luma/Magento_Checkout/web/css/source/module/_cart.less | 6 ------ 1 file changed, 6 deletions(-) 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 f33e5904dca..312191c979c 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 @@ -337,12 +337,6 @@ ); } - .item-gift { - &._active { - border-top: @border-width__base solid @color-gray-light5; - } - } - .product { &-item-photo { display: block; -- GitLab From efd5ed6c48342e6dd91deb40c9e37f7ac34845e5 Mon Sep 17 00:00:00 2001 From: Maksym Iakusha <miakusha@ebay.com> Date: Thu, 28 May 2015 11:06:08 +0300 Subject: [PATCH 024/396] MAGETWO-37983: Improve test code coverage --- .../Unit/Block/Plugin/ProductViewTest.php | 82 +++++++ .../Block/Stockqty/DefaultStockqtyTest.php | 17 +- .../Test/Unit/Model/ConfigurationTest.php | 10 + .../Test/Unit/Model/Stock/ItemTest.php | 55 +++++ .../Model/Stock/StockItemRepositoryTest.php | 214 ++++++++++++++++-- .../Unit/Model/Stock/StockRepositoryTest.php | 186 +++++++++++++++ .../Model/Stock/StockStatusRepositoryTest.php | 184 +++++++++++++++ 7 files changed, 723 insertions(+), 25 deletions(-) create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Block/Plugin/ProductViewTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php 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 00000000000..4edffd7709f --- /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 a513382ecc9..99a074ec52e 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/ConfigurationTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php index 6de9c01656a..14b5bebfb49 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/ConfigurationTest.php @@ -259,4 +259,14 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase ]; $this->assertEquals($fields, $this->model->getConfigItemOptions()); } + + public function testGetManageStock() + { + $store = 1; + $this->scopeConfigMock->expects($this->once()) + ->method('isSetFlag') + ->with(Configuration::XML_PATH_MANAGE_STOCK, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $store) + ->willReturn(1); + $this->assertEquals(1, $this->model->getManageStock($store)); + } } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php index f6cfa8b4e7e..c01d5f129ff 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,59 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->item->setLowStockDate($date); $this->assertEquals($date, $this->item->getLowStockDate()); } + + /** + * @param array $config + * @param float $expected + * @dataProvider getQtyIncrementsDataProvider( + */ + public function testGetQtyIncrements($config, $expected) + { + // $qtyIncrements = 5; + $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 d01e095949e..2271a633723 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php @@ -18,7 +18,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 +32,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 \Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $stockItemMock; + protected $stockItemFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\CatalogInventory\Api\Data\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 +78,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,7 +112,9 @@ 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' + ) ->disableOriginalConstructor() ->getMock(); $this->stockItemCollectionMock = $this->getMockBuilder( @@ -101,12 +128,13 @@ 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') ->disableOriginalConstructor() ->getMock(); $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') @@ -127,29 +155,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 00000000000..517db20a884 --- /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' + ) + ->disableOriginalConstructor() + ->getMock(); + $this->stockCollectionMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockCollectionInterfaceFactory' + ) + ->disableOriginalConstructor() + ->getMock(); + + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->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 00000000000..e9cdd7dc23c --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php @@ -0,0 +1,184 @@ +<?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; + +/** + * 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 Magento\CatalogInventory\Api\Data\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' + ) + ->disableOriginalConstructor() + ->getMock(); + $this->stockStatusCollectionMock = $this->getMockBuilder( + 'Magento\CatalogInventory\Api\Data\StockStatusCollectionInterfaceFactory' + ) + ->disableOriginalConstructor() + ->getMock(); + + $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->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)); + } +} -- GitLab From 4ac9f77763aa614d10801843c2caa1459a0949a0 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Thu, 28 May 2015 11:33:06 +0300 Subject: [PATCH 025/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - added js logic for removing and adding less class --- lib/web/css/source/lib/_navigation.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/css/source/lib/_navigation.less b/lib/web/css/source/lib/_navigation.less index c634943e534..bdf9083f79f 100644 --- a/lib/web/css/source/lib/_navigation.less +++ b/lib/web/css/source/lib/_navigation.less @@ -370,7 +370,7 @@ top: 0 !important; left: 100% !important; } - .submenu-revers{ + .submenu-reverse{ bottom: 0 !important; left: auto !important; right: 100%; -- GitLab From 764edda727e2f54c42dafa631730f796333771fa Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Thu, 28 May 2015 12:36:52 +0300 Subject: [PATCH 026/396] MAGETWO-36023: [UI] Shopping Cart: Gift Wrapping and Gift Messages - CR changes --- .../Magento/luma/web/fonts/Luma-Icons.svg | 55 +------------------ .../Blank-Theme-Icons/Blank-Theme-Icons.svg | 53 +----------------- 2 files changed, 2 insertions(+), 106 deletions(-) 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 d62bf73f9cb..5e68e79f8e3 100644 --- a/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg +++ b/app/design/frontend/Magento/luma/web/fonts/Luma-Icons.svg @@ -1,54 +1 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata>Generated by IcoMoon</metadata> -<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 +<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/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg index 3ae2a0d9791..85f6bf6ddec 100644 --- a/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg +++ b/lib/web/fonts/Blank-Theme-Icons/Blank-Theme-Icons.svg @@ -1,52 +1 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata>Generated by IcoMoon</metadata> -<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> \ 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> -- GitLab From 2c5dd7860e5c6bb0d45d2839b8ce43ab4402e7d8 Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Thu, 28 May 2015 13:14:10 +0300 Subject: [PATCH 027/396] MAGETWO-36908: Stock Items API service to return low stock information does not return the correct results --- .../CatalogInventory/Model/StockRegistry.php | 2 +- .../Test/Unit/Model/StockRegistryTest.php | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php diff --git a/app/code/Magento/CatalogInventory/Model/StockRegistry.php b/app/code/Magento/CatalogInventory/Model/StockRegistry.php index f32aeb2104b..059910b98b6 100644 --- a/app/code/Magento/CatalogInventory/Model/StockRegistry.php +++ b/app/code/Magento/CatalogInventory/Model/StockRegistry.php @@ -172,7 +172,7 @@ class StockRegistry implements StockRegistryInterface $criteria = $this->criteriaFactory->create(); $criteria->setLimit($currentPage, $pageSize); $criteria->setWebsiteFilter($websiteId); - $criteria->setQtyFilter('>=', $qty); + $criteria->setQtyFilter('<=', $qty); $criteria->addField('qty'); return $this->stockItemRepository->getList($criteria); } diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php new file mode 100644 index 00000000000..08d51ff34a4 --- /dev/null +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php @@ -0,0 +1,51 @@ +<?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') + ->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); + } +} -- GitLab From 75fac6f07fcb0e4f49c68f8f34d1f711dcf862eb Mon Sep 17 00:00:00 2001 From: Kristjan Heinaste <kristjan@ontapgroup.com> Date: Thu, 28 May 2015 13:02:00 +0000 Subject: [PATCH 028/396] Fixed a bug where type attribute for tag button was missing --- .../Backend/view/adminhtml/templates/widget/grid/extended.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b266fd638ea..3c4218cb2ff 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;"> -- GitLab From b6d4fd4a801992287691f27a37b78f54400f9755 Mon Sep 17 00:00:00 2001 From: Kateryna Muntianu <kmuntianu@ebay.com> Date: Fri, 29 May 2015 15:03:30 +0300 Subject: [PATCH 029/396] MAGETWO-37152: Permissions set for a category for 'All groups' + a specific group: returns an error, but saves settings --- .../Framework/Model/Resource/Db/AbstractDb.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php index 4aa6000c6d6..87732d71a0f 100644 --- a/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php +++ b/lib/internal/Magento/Framework/Model/Resource/Db/AbstractDb.php @@ -641,12 +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'])) { - $unique['field'] = [$unique['field']]; - } - foreach ($unique['field'] as $field) { + foreach ((array)$unique['field'] as $field) { $value = $data->getData($field); - $select->where($field . '=?', $value === null ? new \Zend_Db_Expr('NULL') : trim($value)); + if ($value === null) { + $select->where($field . ' IS NULL'); + } else { + $select->where($field . '=?', trim($value)); + } } if ($object->getId() || $object->getId() === '0') { -- GitLab From 3960c427ee18ec2fdcc11c472b1a9bbc66a32564 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 29 May 2015 17:53:04 +0300 Subject: [PATCH 030/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - fixed delay function and improved sub-menu reverse --- lib/web/css/source/lib/_navigation.less | 1 - lib/web/mage/menu.js | 42 ++++++++++++++----------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/lib/web/css/source/lib/_navigation.less b/lib/web/css/source/lib/_navigation.less index bdf9083f79f..a3255bbc53f 100644 --- a/lib/web/css/source/lib/_navigation.less +++ b/lib/web/css/source/lib/_navigation.less @@ -329,7 +329,6 @@ margin: 0 !important; position: absolute; left: 0; - top: 100%; z-index: 1; .css(background, @_submenu-background-color); .css(border, @_submenu-border-width @_submenu-border-style @_submenu-border-color); diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index e0d80937fa3..18a5d5c2ad8 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -333,23 +333,26 @@ define([ } }, "mouseenter .ui-menu-item": function (event) { - var target = $(event.currentTarget), - ulWidth = target.find('ul').get(0) ? target.find('ul').get(0).getBoundingClientRect().width : null, - rightThreshold = ulWidth * 2, - leftThreshold = (event.pageX + rightThreshold), - clientWindowWidth = $(window).width(); + var target = $(event.currentTarget); + + if(target.has('ul')){ + var ulElement = target.find('ul'), + ulElementWidth = target.find('ul').outerWidth(true), + width = target.outerWidth()*2, + targetPageX = target.offset().left, + rightBound = screen.width; + + if((ulElementWidth + width + targetPageX)>rightBound){ + ulElement.addClass('submenu-reverse'); + } + if(targetPageX - ulElementWidth<0){ + ulElement.removeClass('submenu-reverse'); + } + } // Remove ui-state-active class from siblings of the newly focused menu item // to avoid a jump caused by adjacent elements both having a class with a border target.siblings().children(".ui-state-active").removeClass("ui-state-active"); - //reverse sub-menus direction from left to right bounds - if (leftThreshold > clientWindowWidth) { - target.find('ul').addClass('submenu-reverse'); - } - //redirect reverse - if (event.pageX <= rightThreshold) { - target.find('ul').removeClass('submenu-reverse'); - } this.focus(event, target); }, "mouseleave": function (event) { @@ -370,12 +373,13 @@ define([ }, 300); } }, - - _delay: function (handler, delay) { - handler.apply(this, arguments); - - return setTimeout(function () { - }, delay || 0); + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); } }); -- GitLab From b4cc3417494656be880b5c6c14fa4ec4c6fd1550 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Fri, 29 May 2015 18:05:42 +0300 Subject: [PATCH 031/396] MAGETWO-36023: [UI] Shopping Cart: Gift Wrapping and Gift Messages --- .../GiftMessage/view/frontend/templates/form.phtml | 2 +- .../web/css/source/module/_cart.less | 3 +++ .../web/css/source/_module.less | 6 +----- .../web/css/source/module/_cart.less | 1 - .../web/css/source/_module.less | 14 ++++++++++++++ 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml index ee99ef0e45f..c301f0f1415 100644 --- a/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml +++ b/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml @@ -12,7 +12,7 @@ <?php /* Gift Message */ ?> <div class="gift-message"> <div class="gift-options-title"> - <span><?php echo __('Gift Message (Optional)'); ?></span> + <span><?php echo __('Gift Message (optional)'); ?></span> </div> <div class="gift-options-content"> 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 91cef0e31cb..9ad50949bfe 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 @@ -376,6 +376,9 @@ &:extend(.abs-shopping-cart-items-mobile all); } } + &.table-wrapper { + overflow: inherit; + } } } 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 4df2ee07bd1..2f54fe103de 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 @@ -99,7 +99,7 @@ &:extend(.abs-add-clearfix all); .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); display: none; - padding: @indent__s 0 @indent__base; + padding: @indent__s @indent__s @indent__base; position: relative; } } @@ -188,10 +188,6 @@ .gift-item-block { border-bottom: 0; .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); - .content { - padding-left: 1.5rem; - padding-right: 1.5rem; - } } } 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 312191c979c..f4adc92d3de 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 @@ -693,7 +693,6 @@ text-align: left; .actions-toolbar { position: relative; - text-transform: uppercase; } } } 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 b3755edb0a1..ab2e7396784 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 @@ -53,6 +53,9 @@ &._active { .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); } + .action { + margin-right: 0; + } } } @@ -227,6 +230,10 @@ padding-right: 1.5rem; } } + + .gift-message-summary { + padding-right: 7rem; + } } // @@ -267,4 +274,11 @@ padding: @indent__base 0; } } + + .item-gift { + td { + padding-left: 0; + padding-right: 0; + } + } } -- GitLab From 7e9e8ecc7acf6683f26744bbd4340b79086fc066 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Fri, 29 May 2015 13:21:14 -0500 Subject: [PATCH 032/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - use existing mysql identifier compression to shorten long trigger names --- .../Framework/DB/Adapter/Pdo/Mysql.php | 80 ++----------------- .../Framework/DB/ExpressionConverter.php | 45 +++++++++++ .../DB/Test/Unit/ExpressionConverterTest.php | 52 ++++++++++++ .../Mview/Test/Unit/View/SubscriptionTest.php | 4 + .../Framework/Mview/View/Subscription.php | 7 +- reinstall-pre.sh | 53 ++++++++++++ 6 files changed, 167 insertions(+), 74 deletions(-) create mode 100644 lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php create mode 100755 reinstall-pre.sh diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 74d74986e0e..a90eefb6f28 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -3117,23 +3117,6 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface return new \Zend_Db_Expr($expr); } - /** - * Minus superfluous characters from hash. - * - * @param string $hash - * @param string $prefix - * @param int $maxCharacters - * @return string - */ - protected function _minusSuperfluous($hash, $prefix, $maxCharacters) - { - $diff = strlen($hash) + strlen($prefix) - $maxCharacters; - $superfluous = $diff / 2; - $odd = $diff % 2; - $hash = substr($hash, $superfluous, - ($superfluous + $odd)); - return $hash; - } - /** * Retrieve valid table name * Check table name length and allowed symbols @@ -3143,22 +3126,12 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface */ 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 ExpressionConverter::shortenEntityName($tableName, 't_'); + } - return $tableName; + public function getTriggerName($triggerName) + { + return ExpressionConverter::shortenEntityName($triggerName, 'trg_'); } /** @@ -3179,35 +3152,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)); } /** @@ -3222,25 +3175,8 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface */ 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 2df91ab7799..44bf35b61b5 100644 --- a/lib/internal/Magento/Framework/DB/ExpressionConverter.php +++ b/lib/internal/Magento/Framework/DB/ExpressionConverter.php @@ -9,6 +9,11 @@ namespace Magento\Framework\DB; class ExpressionConverter { + /** + * Maximum length for many MySql identifiers, including database, table, trigger, and column names + */ + const MYSQL_IDENTIFIER_LEN = 64; + /** * Dictionary for generate short name * @@ -83,4 +88,44 @@ class ExpressionConverter { self::$_translateMap[$from] = $to; } + + /** + * @param string $tableName + * @param string $prefix + * @return string + */ + public static function shortenEntityName($tableName, $prefix) + { + if (strlen($tableName) > self::MYSQL_IDENTIFIER_LEN) { + $shortName = ExpressionConverter::shortName($tableName); + if (strlen($shortName) > self::MYSQL_IDENTIFIER_LEN) { + $hash = md5($tableName); + if (strlen($prefix . $hash) > self::MYSQL_IDENTIFIER_LEN) { + $tableName = self::_minusSuperfluous($hash, $prefix, self::MYSQL_IDENTIFIER_LEN); + } else { + $tableName = $prefix . $hash; + } + } else { + $tableName = $shortName; + } + } + return $tableName; + } + + /** + * Minus superfluous characters from hash. + * + * @param string $hash + * @param string $prefix + * @param int $maxCharacters + * @return string + */ + protected static function _minusSuperfluous($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/ExpressionConverterTest.php b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php new file mode 100644 index 00000000000..40fbcc39547 --- /dev/null +++ b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php @@ -0,0 +1,52 @@ +<?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) + { + $this->assertSame($expectedOut, ExpressionConverter::shortenEntityName($in, $prefix)); + } + + public function shortenEntityNameDataProvider() + { + /** Length of 64 characters, to go over max MySql identifier length */ + $length64 = '________________________________________________________________'; + $length40 = '________________________________________'; + $length20 = '____________________'; + echo $length20; + return [ + 'Short identifier' => [ + 'already_short', + 'pre_', + 'already_short' + ], + 'Hashed identifer' => [ + $length64 . '_cannotBeAbbreviated', + 'pre_', + 'pre_be55448d703c761bf8a322a9993c9ed3' + ], + 'Abbreviated identifier' => [ + $length40 . '_enterprise_notification_index', + 'pre_', + '_________________________________________ent_ntfc_idx' + ], + 'Reduced hash' => [ + $length64 . '_cannotBeAbbreviated', + $length40, + '448d703c761bf8a322a9993c' + ], + ]; + } +} 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 8b36902a699..310bf46ffd2 100644 --- a/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php +++ b/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php @@ -276,4 +276,8 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase ->method('getTableName') ->will($this->returnArgument(0)); } + + public function testGetTriggerName() + { + } } diff --git a/lib/internal/Magento/Framework/Mview/View/Subscription.php b/lib/internal/Magento/Framework/Mview/View/Subscription.php index 498cb0e1478..0a3d7fe500c 100644 --- a/lib/internal/Magento/Framework/Mview/View/Subscription.php +++ b/lib/internal/Magento/Framework/Mview/View/Subscription.php @@ -8,12 +8,14 @@ namespace Magento\Framework\Mview\View; +use Magento\Framework\DB\ExpressionConverter; + class Subscription implements SubscriptionInterface { /** * Trigger name qualifier */ - const TRIGGER_NAME_QUALIFIER = 'trg'; + const TRIGGER_NAME_QUALIFIER = 'trg_'; /** * Database write connection @@ -239,7 +241,8 @@ class Subscription implements SubscriptionInterface */ protected function getTriggerName($tableName, $time, $event) { - return self::TRIGGER_NAME_QUALIFIER . '_' . $tableName . '_' . $time . '_' . $event; + $triggerName = $tableName . '_' . $time . '_' . $event; + return ExpressionConverter::shortenEntityName($triggerName, self::TRIGGER_NAME_QUALIFIER); } /** diff --git a/reinstall-pre.sh b/reinstall-pre.sh new file mode 100755 index 00000000000..3a93997fbde --- /dev/null +++ b/reinstall-pre.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +DATABASE_NAME=magento2 +DATABASE_USERNAME=root +ADMIN_EMAIL=admin@example.com +ADMIN_USERNAME=admin +ADMIN_PASSWORD=password1 +BASE_URL=http://m2.com/ + +mysql -u $DATABASE_USERNAME -e "drop database $DATABASE_NAME;" +mysql -u $DATABASE_USERNAME -e "create database $DATABASE_NAME;" + +rm app/etc/env.php app/etc/config.php +rm -rf var/* +rm -rf pub/media/* +rm app/etc/config.php +rm -rf pub/static/* +rm -rf pub/opt/* +rm -rf pub/errors/* + +git checkout -- pub + +# Should really do a chown to the right user +chmod -R a+wX var +chmod -R a+wX app/etc +chmod -R a+wX pub + +composer install + +php bin/magento setup:install \ + --db-host=127.0.0.1 \ + --db-name=$DATABASE_NAME \ + --db-user=$DATABASE_USERNAME \ + --base-url=$BASE_URL \ + --language=en_US \ + --timezone=America/Chicago \ + --currency=USD \ + --admin-user=$ADMIN_USERNAME \ + --admin-password=$ADMIN_PASSWORD \ + --admin-email=$ADMIN_EMAIL \ + --admin-firstname=John \ + --admin-lastname=Doe \ + --cleanup-database \ + --backend-frontname=admin \ + --use-rewrites=1 \ + --db-prefix=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +# --use-sample-data=1 + +# Should really do a chown to the right user +chmod -R a+wX var +chmod -R a+wX app/etc +chmod -R a+wX pub + -- GitLab From 7d875e8e8db516071002d29907b5608972c9d0ea Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Fri, 29 May 2015 16:49:17 -0500 Subject: [PATCH 033/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - place compression logic in MySql adapter - write tests for modified compression methods - update tests for new methods in ExpressionConverter --- .../Framework/DB/Adapter/Pdo/Mysql.php | 14 ++++-- .../DB/Test/Unit/Adapter/Pdo/MysqlTest.php | 37 +++++++++++--- .../DB/Test/Unit/ExpressionConverterTest.php | 28 ++++++----- .../Mview/Test/Unit/View/SubscriptionTest.php | 6 ++- .../Framework/Mview/View/Subscription.php | 50 +++++++++---------- 5 files changed, 87 insertions(+), 48 deletions(-) diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index a90eefb6f28..abf64d9e806 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; @@ -3118,20 +3119,27 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface } /** - * Retrieve valid table name - * Check table name length and allowed symbols + * Returns a compressed version of the table name if it is too long * * @param string $tableName * @return string + * @codeCoverageIgnore Covered by tests on ExpressionConverter */ public function getTableName($tableName) { return ExpressionConverter::shortenEntityName($tableName, 't_'); } + /** + * Returns a compressed version of the trigger name if it is too long + * + * @param string $triggerName + * @return string + * @codeCoverageIgnore Covered by tests on ExpressionConverter + */ public function getTriggerName($triggerName) { - return ExpressionConverter::shortenEntityName($triggerName, 'trg_'); + return ExpressionConverter::shortenEntityName($triggerName, Subscription::TRIGGER_NAME_QUALIFIER); } /** 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 b7c080064bc..60d336d544d 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,27 @@ class MysqlTest extends \PHPUnit_Framework_TestCase ] ]; } + + /** + * @dataProvider getIndexNameDataProvider + */ + public function testGetIndexName($name, $fields, $indexType, $expectedName) + { + $this->assertTrue( + strpos($this->_mockAdapter->getIndexName($name, $fields, $indexType), $expectedName) === 0, + 'Index name did not start with expected prefix' + ); + } + + 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 index 40fbcc39547..0f24beb9c35 100644 --- a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php +++ b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php @@ -16,16 +16,16 @@ class ExpressionConverterTest extends \PHPUnit_Framework_TestCase */ public function testShortenEntityName($in, $prefix, $expectedOut) { - $this->assertSame($expectedOut, ExpressionConverter::shortenEntityName($in, $prefix)); + $this->assertTrue( + strpos(ExpressionConverter::shortenEntityName($in, $prefix), $expectedOut) === 0, + 'Entity name did not start with expected prefix' + ); } public function shortenEntityNameDataProvider() { - /** Length of 64 characters, to go over max MySql identifier length */ $length64 = '________________________________________________________________'; $length40 = '________________________________________'; - $length20 = '____________________'; - echo $length20; return [ 'Short identifier' => [ 'already_short', @@ -35,18 +35,22 @@ class ExpressionConverterTest extends \PHPUnit_Framework_TestCase 'Hashed identifer' => [ $length64 . '_cannotBeAbbreviated', 'pre_', - 'pre_be55448d703c761bf8a322a9993c9ed3' + 'pre_' ], 'Abbreviated identifier' => [ - $length40 . '_enterprise_notification_index', + $length40 . 'enterprise_notification_index', 'pre_', - '_________________________________________ent_ntfc_idx' - ], - 'Reduced hash' => [ - $length64 . '_cannotBeAbbreviated', - $length40, - '448d703c761bf8a322a9993c' + $length40 . 'ent_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/Mview/Test/Unit/View/SubscriptionTest.php b/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php index 310bf46ffd2..1f7a3507c28 100644 --- a/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php +++ b/lib/internal/Magento/Framework/Mview/Test/Unit/View/SubscriptionTest.php @@ -94,10 +94,12 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase public function testCreate() { $this->mockGetTableName(); - + $shortTriggerName = 'short_trigger_name'; + $this->connectionMock->expects($this->atLeastOnce())->method('getTriggerName')->willReturn($shortTriggerName); $triggerMock = $this->getMock('Magento\Framework\DB\Ddl\Trigger', [], [], '', false, false); $triggerMock->expects($this->exactly(3)) ->method('setName') + ->with($shortTriggerName) ->will($this->returnSelf()); $triggerMock->expects($this->exactly(3)) ->method('getName') @@ -265,7 +267,7 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase */ protected function mockGetConnection($connection) { - $this->resourceMock->expects($this->once()) + $this->resourceMock->expects($this->atLeastOnce()) ->method('getConnection') ->will($this->returnValue($connection)); } diff --git a/lib/internal/Magento/Framework/Mview/View/Subscription.php b/lib/internal/Magento/Framework/Mview/View/Subscription.php index 0a3d7fe500c..9ff3ae97d65 100644 --- a/lib/internal/Magento/Framework/Mview/View/Subscription.php +++ b/lib/internal/Magento/Framework/Mview/View/Subscription.php @@ -8,6 +8,8 @@ namespace Magento\Framework\Mview\View; +use Magento\Framework\App\Resource; +use Magento\Framework\DB\Ddl\Trigger; use Magento\Framework\DB\ExpressionConverter; class Subscription implements SubscriptionInterface @@ -25,7 +27,7 @@ class Subscription implements SubscriptionInterface protected $write; /** - * @var \Magento\Framework\DB\Ddl\Trigger + * @var Trigger */ protected $triggerFactory; @@ -57,12 +59,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 @@ -70,7 +72,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, @@ -93,23 +95,22 @@ class Subscription implements SubscriptionInterface */ public function create() { - foreach (\Magento\Framework\DB\Ddl\Trigger::getListOfEvents() as $event) { + foreach (Trigger::getListOfEvents() as $event) { $triggerName = $this->getTriggerName( $this->resource->getTableName($this->getTableName()), - \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER, + Trigger::TIME_AFTER, $event ); + /** Shorten if trigger name is too long - max is 64 characters */ + $shortenedTriggerName = $this->resource->getConnection(Resource::DEFAULT_READ_RESOURCE) + ->getTriggerName($triggerName, self::TRIGGER_NAME_QUALIFIER); - /** @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()) - ); + /** @var Trigger $trigger */ + $trigger = $this->triggerFactory->create() + ->setName($shortenedTriggerName) + ->setTime(Trigger::TIME_AFTER) + ->setEvent($event) + ->setTable($this->resource->getTableName($this->tableName)); $trigger->addStatement($this->buildStatement($event, $this->getView()->getChangelog())); @@ -133,18 +134,18 @@ class Subscription implements SubscriptionInterface */ public function remove() { - foreach (\Magento\Framework\DB\Ddl\Trigger::getListOfEvents() as $event) { + foreach (Trigger::getListOfEvents() as $event) { $triggerName = $this->getTriggerName( $this->resource->getTableName($this->getTableName()), - \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER, + Trigger::TIME_AFTER, $event ); - /** @var \Magento\Framework\DB\Ddl\Trigger $trigger */ + /** @var Trigger $trigger */ $trigger = $this->triggerFactory->create()->setName( $triggerName )->setTime( - \Magento\Framework\DB\Ddl\Trigger::TIME_AFTER + Trigger::TIME_AFTER )->setEvent( $event )->setTable( @@ -206,8 +207,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())), @@ -215,7 +216,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())), @@ -241,8 +242,7 @@ class Subscription implements SubscriptionInterface */ protected function getTriggerName($tableName, $time, $event) { - $triggerName = $tableName . '_' . $time . '_' . $event; - return ExpressionConverter::shortenEntityName($triggerName, self::TRIGGER_NAME_QUALIFIER); + return self::TRIGGER_NAME_QUALIFIER . $tableName . '_' . $time . '_' . $event; } /** -- GitLab From a5a90b42ee8b487264b7e1d9eb1cc63b2d1f04b0 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Fri, 29 May 2015 16:52:22 -0500 Subject: [PATCH 034/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - remove accidentally added installation script --- reinstall-pre.sh | 53 ------------------------------------------------ 1 file changed, 53 deletions(-) delete mode 100755 reinstall-pre.sh diff --git a/reinstall-pre.sh b/reinstall-pre.sh deleted file mode 100755 index 3a93997fbde..00000000000 --- a/reinstall-pre.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -DATABASE_NAME=magento2 -DATABASE_USERNAME=root -ADMIN_EMAIL=admin@example.com -ADMIN_USERNAME=admin -ADMIN_PASSWORD=password1 -BASE_URL=http://m2.com/ - -mysql -u $DATABASE_USERNAME -e "drop database $DATABASE_NAME;" -mysql -u $DATABASE_USERNAME -e "create database $DATABASE_NAME;" - -rm app/etc/env.php app/etc/config.php -rm -rf var/* -rm -rf pub/media/* -rm app/etc/config.php -rm -rf pub/static/* -rm -rf pub/opt/* -rm -rf pub/errors/* - -git checkout -- pub - -# Should really do a chown to the right user -chmod -R a+wX var -chmod -R a+wX app/etc -chmod -R a+wX pub - -composer install - -php bin/magento setup:install \ - --db-host=127.0.0.1 \ - --db-name=$DATABASE_NAME \ - --db-user=$DATABASE_USERNAME \ - --base-url=$BASE_URL \ - --language=en_US \ - --timezone=America/Chicago \ - --currency=USD \ - --admin-user=$ADMIN_USERNAME \ - --admin-password=$ADMIN_PASSWORD \ - --admin-email=$ADMIN_EMAIL \ - --admin-firstname=John \ - --admin-lastname=Doe \ - --cleanup-database \ - --backend-frontname=admin \ - --use-rewrites=1 \ - --db-prefix=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -# --use-sample-data=1 - -# Should really do a chown to the right user -chmod -R a+wX var -chmod -R a+wX app/etc -chmod -R a+wX pub - -- GitLab From aec0ab0d2f0cb151680b13efc8c7c84c5f387d24 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Tue, 2 Jun 2015 11:36:27 +0300 Subject: [PATCH 035/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - fixed delay function and improved sub-menu reverse --- lib/web/mage/menu.js | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 18a5d5c2ad8..6500a653a38 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -333,19 +333,24 @@ define([ } }, "mouseenter .ui-menu-item": function (event) { - var target = $(event.currentTarget); - - if(target.has('ul')){ - var ulElement = target.find('ul'), - ulElementWidth = target.find('ul').outerWidth(true), - width = target.outerWidth()*2, - targetPageX = target.offset().left, - rightBound = screen.width; - - if((ulElementWidth + width + targetPageX)>rightBound){ + var target = $(event.currentTarget), + ulElement, + ulElementWidth, + width, + targetPageX, + rightBound; + + if (target.has('ul')) { + ulElement = target.find('ul'); + ulElementWidth = target.find('ul').outerWidth(true); + width = target.outerWidth() * 2; + targetPageX = target.offset().left; + rightBound = screen.width; + + if ((ulElementWidth + width + targetPageX) > rightBound) { ulElement.addClass('submenu-reverse'); } - if(targetPageX - ulElementWidth<0){ + if ((targetPageX - ulElementWidth) < 0) { ulElement.removeClass('submenu-reverse'); } } -- GitLab From 7784938b9dda2296bccd865653f39ecb1878e645 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Wed, 3 Jun 2015 10:43:35 +0300 Subject: [PATCH 036/396] MAGETWO-11129: Found records in global search in Backend can't be selected via keyboard --- .../module/header/actions-group/_search.less | 3 +++ lib/web/mage/backend/suggest.js | 27 ++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less index 27524d7d4d0..6895895f292 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less +++ b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less @@ -95,6 +95,9 @@ display: block; font-size: @font-size__s; padding: @search-global-input__padding-top @search-global-input__padding-side @search-global-input__padding-bottom; + &._active { + background-color: #ced7f6; + } } .title { display: block; diff --git a/lib/web/mage/backend/suggest.js b/lib/web/mage/backend/suggest.js index dfb3ef72d8c..b0bab182a09 100644 --- a/lib/web/mage/backend/suggest.js +++ b/lib/web/mage/backend/suggest.js @@ -19,7 +19,7 @@ factory(root.jQuery, root.mageTemplate); } }(this, function ($, mageTemplate) { - 'use strict'; + //'use strict'; /** * Implement base functionality @@ -178,16 +178,37 @@ _bind: function () { this._on($.extend({ keydown: function (event) { - var keyCode = $.ui.keyCode; + var keyCode = $.ui.keyCode, + suggestList; switch (event.keyCode) { case keyCode.PAGE_UP: - case keyCode.PAGE_DOWN: case keyCode.UP: + if (!event.shiftKey) { + event.preventDefault(); + this._proxyEvents(event); + } + + suggestList = event.currentTarget.parentNode.getElementsByTagName('ul')[0]; + if (suggestList) { + $(suggestList.getElementsByClassName('_active')[0]).removeClass('_active').prev().addClass('_active');; + } + break; + case keyCode.PAGE_DOWN: case keyCode.DOWN: if (!event.shiftKey) { event.preventDefault(); this._proxyEvents(event); } + + suggestList = event.currentTarget.parentNode.getElementsByTagName('ul')[0]; + if(suggestList){ + if(suggestList.getElementsByClassName('_active').length === 0) { + $(suggestList.children[0]).addClass('_active'); + }else { + $(suggestList.getElementsByClassName('_active')[0]).removeClass('_active').next().addClass('_active'); + } + } + break; case keyCode.TAB: if (this.isDropdownShown()) { -- GitLab From a65ecd995b7cc87555213d10d9515c724a27dcd8 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Wed, 3 Jun 2015 11:29:01 +0300 Subject: [PATCH 037/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - fixed delay function and improved sub-menu reverse --- lib/web/mage/menu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 6500a653a38..0c6f62992de 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -345,7 +345,7 @@ define([ ulElementWidth = target.find('ul').outerWidth(true); width = target.outerWidth() * 2; targetPageX = target.offset().left; - rightBound = screen.width; + rightBound = $(window).width(); if ((ulElementWidth + width + targetPageX) > rightBound) { ulElement.addClass('submenu-reverse'); -- GitLab From 52e9f0f3b13620ebcd6112beea2e98cb942f5dd8 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Wed, 3 Jun 2015 11:46:59 +0300 Subject: [PATCH 038/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - fixed delay function and improved sub-menu reverse --- lib/web/css/source/lib/_navigation.less | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/web/css/source/lib/_navigation.less b/lib/web/css/source/lib/_navigation.less index a3255bbc53f..a0af0e4ebd8 100644 --- a/lib/web/css/source/lib/_navigation.less +++ b/lib/web/css/source/lib/_navigation.less @@ -370,7 +370,6 @@ left: 100% !important; } .submenu-reverse{ - bottom: 0 !important; left: auto !important; right: 100%; } -- GitLab From b4d47705927c0ddca121ccbbf589b47fc050aac7 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 3 Jun 2015 19:00:50 +0300 Subject: [PATCH 039/396] MAGETWO-38153: Implement extensible point in cart --- .../Checkout/view/frontend/layout/checkout_cart_index.xml | 1 + .../Magento/Checkout/view/frontend/templates/cart/form.phtml | 1 + 2 files changed, 2 insertions(+) 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 d0aeb1702d3..2aea829a82b 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.additional.options"/> </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/templates/cart/form.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml index d34488d2b67..61207e5033c 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -61,3 +61,4 @@ </div> </form> <?php echo $block->getChildHtml('shopping.cart.table.after'); ?> +<?php echo $block->getChildHtml('checkout.cart.additional.options') ?> -- GitLab From 60c07377218689aa441d1ab13599028f4b155d47 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Wed, 3 Jun 2015 19:45:23 +0300 Subject: [PATCH 040/396] MAGETWO-11129: Found records in global search in Backend can't be selected via keyboard - added keyup/down support --- lib/web/mage/backend/suggest.js | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/web/mage/backend/suggest.js b/lib/web/mage/backend/suggest.js index b0bab182a09..e10ed0cc5ee 100644 --- a/lib/web/mage/backend/suggest.js +++ b/lib/web/mage/backend/suggest.js @@ -179,7 +179,10 @@ this._on($.extend({ keydown: function (event) { var keyCode = $.ui.keyCode, - suggestList; + suggestList, + hasSuggestedItems, + hasSelectedItems, + selectedItem; switch (event.keyCode) { case keyCode.PAGE_UP: case keyCode.UP: @@ -189,9 +192,12 @@ } suggestList = event.currentTarget.parentNode.getElementsByTagName('ul')[0]; - if (suggestList) { - $(suggestList.getElementsByClassName('_active')[0]).removeClass('_active').prev().addClass('_active');; + hasSuggestedItems = event.currentTarget.parentNode.getElementsByTagName('ul')[0].children.length >= 0; + if (hasSuggestedItems) { + selectedItem = $(suggestList.getElementsByClassName('_active')[0]).removeClass('_active').prev().addClass('_active'); + event.currentTarget.value = selectedItem.find("a").text(); } + break; case keyCode.PAGE_DOWN: case keyCode.DOWN: @@ -201,11 +207,15 @@ } suggestList = event.currentTarget.parentNode.getElementsByTagName('ul')[0]; - if(suggestList){ - if(suggestList.getElementsByClassName('_active').length === 0) { - $(suggestList.children[0]).addClass('_active'); + hasSuggestedItems = event.currentTarget.parentNode.getElementsByTagName('ul')[0].children.length >= 0; + if(hasSuggestedItems){ + hasSelectedItems = suggestList.getElementsByClassName('_active').length === 0; + if(hasSelectedItems) { + selectedItem = $(suggestList.children[0]).addClass('_active'); + event.currentTarget.value = selectedItem.find("a").text(); }else { - $(suggestList.getElementsByClassName('_active')[0]).removeClass('_active').next().addClass('_active'); + selectedItem = $(suggestList.getElementsByClassName('_active')[0]).removeClass('_active').next().addClass('_active'); + event.currentTarget.value = selectedItem.find("a").text(); } } @@ -218,6 +228,7 @@ break; case keyCode.ENTER: case keyCode.NUMPAD_ENTER: + if (this.isDropdownShown() && this._focused) { this._proxyEvents(event); event.preventDefault(); -- GitLab From 9adb6e01ada23a6340515c1fce066e92f838537f Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 3 Jun 2015 19:46:37 +0300 Subject: [PATCH 041/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - content for several modules was changed --- .../AdminNotification/Block/Window.php | 2 +- .../Model/System/Message/Baseurl.php | 2 +- .../Message/Media/Synchronization/Error.php | 3 +- .../Model/System/Message/Security.php | 4 +- .../Media/Synchronization/ErrorTest.php | 2 +- .../Authorization/Model/Acl/AclRetriever.php | 7 +- .../Test/Unit/Model/Acl/AclRetrieverTest.php | 2 +- app/code/Magento/Backend/Block/Cache.php | 2 +- .../Adminhtml/System/Account/Save.php | 2 +- .../Adminhtml/System/Design/Delete.php | 2 +- .../Controller/Adminhtml/System/Store.php | 2 +- .../Adminhtml/System/Store/DeleteGroup.php | 2 +- .../System/Store/DeleteGroupPost.php | 4 +- .../Adminhtml/System/Store/DeleteStore.php | 2 +- .../System/Store/DeleteStorePost.php | 4 +- .../Adminhtml/System/Store/DeleteWebsite.php | 2 +- .../System/Store/DeleteWebsitePost.php | 4 +- .../Adminhtml/System/Store/EditStore.php | 6 +- .../Adminhtml/System/Store/Save.php | 8 +- .../Adminhtml/System/Account/SaveTest.php | 2 +- .../adminhtml/templates/media/uploader.phtml | 2 +- .../adminhtml/templates/widget/tabs.phtml | 2 +- .../templates/widget/tabshoriz.phtml | 2 +- .../Controller/Adminhtml/Index/Create.php | 4 +- .../Controller/Adminhtml/Index/MassDelete.php | 4 +- .../Controller/Adminhtml/Index/Rollback.php | 14 +- app/code/Magento/Backup/Helper/Data.php | 8 +- .../adminhtml/layout/backup_index_block.xml | 2 +- .../adminhtml/templates/backup/dialogs.phtml | 8 +- .../Edit/Tab/Bundle/Option/Search/Grid.php | 2 +- .../Magento/Bundle/Model/Product/Type.php | 2 +- .../Test/Unit/Model/Product/TypeTest.php | 2 +- .../fieldset/options/type/radio.phtml | 2 +- .../fieldset/options/type/select.phtml | 2 +- .../view/type/bundle/option/radio.phtml | 2 +- .../view/type/bundle/option/select.phtml | 2 +- .../order/creditmemo/items/renderer.phtml | 2 +- .../sales/order/items/renderer.phtml | 2 +- app/code/Magento/Captcha/etc/config.xml | 2 +- .../Adminhtml/Product/Attribute/Edit.php | 4 +- .../Product/Attribute/Edit/Tab/Front.php | 14 +- .../Adminhtml/Product/Attribute/Edit/Tabs.php | 4 +- .../Adminhtml/Product/Attribute/Set/Main.php | 10 +- .../Product/Attribute/Set/Toolbar/Add.php | 4 +- .../Adminhtml/Product/Edit/Tab/Crosssell.php | 2 +- .../Adminhtml/Product/Edit/Tab/Related.php | 2 +- .../Adminhtml/Product/Edit/Tab/Upsell.php | 2 +- .../Catalog/Block/Adminhtml/Product/Grid.php | 2 +- .../Product/Helper/Form/BaseImage.php | 2 +- .../Controller/Adminhtml/Category/Save.php | 4 +- .../Adminhtml/Product/Attribute/Delete.php | 4 +- .../Adminhtml/Product/Attribute/Save.php | 4 +- .../Adminhtml/Product/Attribute/Validate.php | 4 +- .../Adminhtml/Product/Set/Delete.php | 2 +- .../Adminhtml/Product/Set/Index.php | 2 +- .../Controller/Adminhtml/Product/Set/Save.php | 6 +- .../Catalog/Helper/Product/Flat/Indexer.php | 2 +- app/code/Magento/Catalog/Model/Category.php | 8 +- .../Model/Indexer/Product/Eav/Action/Row.php | 4 +- .../Model/Indexer/Product/Flat/Action/Row.php | 2 +- .../Indexer/Product/Price/Action/Row.php | 4 +- .../Catalog/Model/Layer/Filter/Item.php | 2 +- .../Model/Product/AttributeSet/Build.php | 2 +- .../Model/Product/Option/Type/DefaultType.php | 2 +- .../Product/Option/Type/File/Validator.php | 2 +- .../Catalog/Model/Resource/Product.php | 2 +- .../Magento/Catalog/Setup/InstallSchema.php | 2 +- .../Catalog/Test/Unit/Model/CategoryTest.php | 6 +- .../Indexer/Product/Eav/Action/RowTest.php | 2 +- .../Indexer/Product/Flat/Action/RowTest.php | 2 +- .../Indexer/Product/Price/Action/RowTest.php | 2 +- .../Product/Media/AttributeManagementTest.php | 2 +- .../Test/Unit/Model/Resource/ProductTest.php | 2 +- app/code/Magento/Catalog/etc/widget.xml | 4 +- .../catalog/product/attribute/set/main.phtml | 8 +- .../fieldset/options/type/date.phtml | 2 +- .../fieldset/options/type/file.phtml | 2 +- .../product/edit/action/inventory.phtml | 2 +- .../product/edit/action/websites.phtml | 2 +- .../catalog/product/edit/options.phtml | 2 +- .../product/edit/options/type/file.phtml | 2 +- .../catalog/product/edit/websites.phtml | 2 +- .../catalog/product/helper/gallery.phtml | 2 +- .../catalog/product/tab/inventory.phtml | 4 +- .../templates/product/edit/tabs.phtml | 2 +- .../web/catalog/base-image-uploader.js | 2 +- .../frontend/layout/catalog_product_view.xml | 2 +- .../templates/product/compare/list.phtml | 2 +- .../frontend/templates/product/list.phtml | 8 +- .../templates/product/list/items.phtml | 8 +- .../frontend/templates/product/listing.phtml | 4 +- .../templates/product/view/addto.phtml | 4 +- .../templates/product/view/attributes.phtml | 2 +- .../templates/product/view/base-image.phtml | 4 +- .../product/view/options/type/file.phtml | 2 +- .../product/widget/new/content/new_grid.phtml | 4 +- .../product/widget/new/content/new_list.phtml | 4 +- .../frontend/web/js/view/compare-products.js | 4 +- .../Model/Import/Product.php | 4 +- .../Model/Import/Product/Option.php | 22 +- .../Model/Indexer/Stock/Action/Row.php | 2 +- .../Model/Quote/Item/QuantityValidator.php | 2 +- .../Model/StockStateProvider.php | 2 +- .../Model/Indexer/Stock/Action/RowTest.php | 2 +- .../CatalogInventory/etc/adminhtml/system.xml | 2 +- .../frontend/templates/qtyincrements.phtml | 2 +- .../Block/Adminhtml/Promo/Catalog.php | 2 +- .../Promo/Catalog/Edit/Tab/Actions.php | 26 +-- .../Promo/Catalog/Edit/Tab/Conditions.php | 2 +- .../Adminhtml/Promo/Catalog/Edit/Tab/Main.php | 4 +- .../Controller/Adminhtml/Promo/Catalog.php | 2 +- .../Adminhtml/Promo/Catalog/ApplyRules.php | 2 +- .../Adminhtml/Promo/Catalog/Delete.php | 6 +- .../Adminhtml/Promo/Catalog/Edit.php | 2 +- .../Adminhtml/Promo/Catalog/Index.php | 2 +- .../Adminhtml/Promo/Catalog/Save.php | 4 +- .../Model/Indexer/AbstractIndexer.php | 2 +- .../Plugin/Indexer/Product/Attribute.php | 2 +- .../CatalogRule/Setup/InstallSchema.php | 2 +- .../Model/Indexer/AbstractIndexerTest.php | 2 +- app/code/Magento/CatalogRule/etc/acl.xml | 2 +- .../CatalogRule/etc/adminhtml/menu.xml | 2 +- .../frontend/templates/advanced/result.phtml | 2 +- .../view/frontend/templates/result.phtml | 2 +- .../product/widget/content/grid.phtml | 4 +- .../Magento/Checkout/Controller/Cart/Add.php | 2 +- .../Checkout/Controller/Cart/Addgroup.php | 5 +- .../Checkout/Controller/Cart/CouponPost.php | 4 +- .../Checkout/Controller/Cart/Delete.php | 2 +- .../Controller/Cart/UpdateItemOptions.php | 2 +- .../Checkout/Controller/Cart/UpdatePost.php | 4 +- .../Checkout/Controller/Onepage/Index.php | 2 +- app/code/Magento/Checkout/Model/Cart.php | 2 +- .../Magento/Checkout/Model/Type/Onepage.php | 10 +- .../layout/checkout_onepage_failure.xml | 2 +- .../view/frontend/templates/cart/form.phtml | 2 +- .../cart/item/configure/updatecart.phtml | 4 +- .../templates/cart/item/default.phtml | 8 +- .../templates/onepage/review/info.phtml | 2 +- .../templates/onepage/review/item.phtml | 2 +- .../onepage/shipping_method/available.phtml | 2 +- .../view/frontend/templates/success.phtml | 2 +- .../frontend/web/js/opc-checkout-method.js | 2 +- .../view/frontend/web/js/opc-payment-info.js | 2 +- .../frontend/web/js/opc-shipping-method.js | 2 +- .../view/frontend/web/js/opcheckout.js | 6 +- .../Checkout/view/frontend/web/js/payment.js | 2 +- .../view/frontend/web/js/view/minicart.js | 2 +- .../web/js/view/review/item/columns/qty.js | 2 +- .../frontend/web/template/authentication.html | 2 +- .../web/template/minicart/item/default.html | 4 +- .../view/frontend/web/template/progress.html | 2 +- .../web/template/review/item/columns/qty.html | 2 +- .../web/template/shipping-method.html | 2 +- .../Controller/Adminhtml/Agreement/Delete.php | 2 +- .../Controller/Adminhtml/Agreement/Save.php | 2 +- .../Cms/Controller/Adminhtml/Block/Delete.php | 2 +- .../Cms/Controller/Adminhtml/Block/Save.php | 2 +- .../Cms/Controller/Adminhtml/Page/Save.php | 2 +- .../Cms/Model/Wysiwyg/Images/Storage.php | 2 +- .../Adminhtml/System/Config/Save.php | 2 +- .../Backend/Currency/DefaultCurrency.php | 2 +- .../Model/OptionRepository.php | 4 +- .../Model/Product/Type/Configurable.php | 2 +- .../Model/Product/Type/ConfigurableTest.php | 2 +- .../catalog/product/attribute/set/js.phtml | 4 +- .../catalog/product/edit/super/matrix.phtml | 2 +- .../form.phtml | 4 +- .../affected-attribute-set-selector/js.phtml | 2 +- .../Controller/Account/CreatePost.php | 2 +- .../Controller/Adminhtml/Index/Save.php | 2 +- .../view/adminhtml/templates/tab/cart.phtml | 2 +- .../checkout/cart/item/default.phtml | 2 +- .../Model/AuthorizationService.php | 4 +- .../layout/multishipping_checkout_success.xml | 2 +- .../templates/checkout/shipping.phtml | 2 +- .../Controller/Adminhtml/Template/Save.php | 2 +- .../templates/transparent/info.phtml | 2 +- .../frontend/templates/transparent/info.phtml | 2 +- .../product/widget/viewed/item.phtml | 4 +- .../compared/content/compared_grid.phtml | 4 +- .../compared/content/compared_list.phtml | 4 +- .../widget/viewed/content/viewed_grid.phtml | 4 +- .../widget/viewed/content/viewed_list.phtml | 4 +- .../Controller/Adminhtml/Product/Post.php | 2 +- .../frontend/templates/customer/list.phtml | 2 +- .../Controller/AbstractController/Reorder.php | 2 +- .../Magento/Sales/Model/AdminOrder/Create.php | 2 +- .../templates/order/create/items/grid.phtml | 4 +- .../Promo/Quote/Edit/Tab/Actions.php | 6 +- .../Adminhtml/Promo/Quote/Delete.php | 4 +- .../Controller/Adminhtml/Promo/Quote/Save.php | 4 +- app/code/Magento/Search/Helper/Data.php | 2 +- .../UrlRewrite/Block/Catalog/Edit/Form.php | 2 +- .../UrlRewrite/Block/Cms/Page/Edit/Form.php | 2 +- .../Adminhtml/Url/Rewrite/Delete.php | 4 +- .../Controller/Adminhtml/Url/Rewrite/Save.php | 6 +- .../order/create/items/price/row.phtml | 2 +- .../order/create/items/price/total.phtml | 2 +- .../order/create/items/price/unit.phtml | 2 +- .../review/item/price/row_incl_tax.phtml | 2 +- .../review/item/price/unit_incl_tax.phtml | 2 +- .../templates/email/items/price/row.phtml | 2 +- .../frontend/templates/item/price/row.phtml | 2 +- .../frontend/templates/item/price/unit.phtml | 2 +- .../review/item/price/row_incl_tax.html | 2 +- .../review/item/price/unit_incl_tax.html | 2 +- .../Widget/Instance/Edit/Tab/Main.php | 6 +- .../Magento/Wishlist/Model/ItemCarrier.php | 2 +- .../customer/edit/tab/wishlist.phtml | 2 +- .../frontend/templates/options_list.phtml | 2 +- .../view/frontend/templates/shared.phtml | 2 +- .../Api/AttributeSetManagementTest.php | 2 +- .../Catalog/Test/Block/Product/View.php | 4 +- ...rtProductAttributeSuccessDeleteMessage.php | 4 +- .../Constraint/AssertProductTemplateForm.php | 2 +- .../AssertProductTemplateInGrid.php | 2 +- .../AssertProductTemplateNotInGrid.php | 2 +- .../AssertProductTemplateOnProductForm.php | 4 +- ...ertProductTemplateSuccessDeleteMessage.php | 2 +- ...ssertProductTemplateSuccessSaveMessage.php | 2 +- .../AssertCatalogPriceRuleNoticeMessage.php | 4 +- ...rtCatalogPriceRuleSuccessDeleteMessage.php | 4 +- ...sertCatalogPriceRuleSuccessSaveMessage.php | 2 +- .../CatalogRule/Test/Fixture/CatalogRule.xml | 4 +- .../Test/Handler/CatalogRule/Curl.php | 8 +- .../Test/Repository/CatalogRule.xml | 18 +- .../CreateCatalogPriceRuleEntityTest.xml | 4 +- .../Test/TestCase/CreateCatalogRuleTest.xml | 4 +- .../Test/TestCase/NavigateMenuTest.xml | 4 +- .../UpdateCatalogPriceRuleEntityTest.xml | 2 +- .../AssertAdvancedSearchProductsResult.php | 2 +- .../Test/Block/Cart/AbstractCartItem.php | 2 +- .../Checkout/Test/Block/Cart/CartItem.php | 4 +- .../Checkout/Test/Block/Onepage/Login.php | 2 +- .../AssertTermSuccessDeleteMessage.php | 2 +- .../AssertTermSuccessSaveMessage.php | 2 +- .../AssertCmsBlockDeleteMessage.php | 2 +- .../AssertCmsBlockSuccessSaveMessage.php | 2 +- .../AssertCmsPageSuccessSaveMessage.php | 6 +- .../Test/TestCase/OnePageCheckoutTest.xml | 2 +- ...MultishippingOrderSuccessPlacedMessage.php | 2 +- ...ssertCartPriceRuleSuccessDeleteMessage.php | 2 +- .../AssertCartPriceRuleSuccessSaveMessage.php | 2 +- ...oreGroupSuccessDeleteAndBackupMessages.php | 2 +- .../AssertStoreGroupSuccessDeleteMessage.php | 2 +- .../AssertStoreGroupSuccessSaveMessage.php | 2 +- ...ertStoreSuccessDeleteAndBackupMessages.php | 2 +- .../AssertStoreSuccessDeleteMessage.php | 2 +- .../AssertStoreSuccessSaveMessage.php | 2 +- ...tWebsiteSuccessDeleteAndBackupMessages.php | 2 +- .../AssertWebsiteSuccessDeleteMessage.php | 2 +- .../AssertWebsiteSuccessSaveMessage.php | 2 +- .../Ups/Test/TestCase/OnePageCheckoutTest.xml | 2 +- .../AssertUrlRewriteDeletedMessage.php | 2 +- .../Test/TestCase/OnePageCheckoutTest.xml | 2 +- .../Block/Customer/Wishlist/Items/Product.php | 2 +- .../AbstractAssertWishlistProductDetails.php | 2 +- .../AssertProductDetailsInWishlist.php | 4 +- .../Controller/Adminhtml/CategoryTest.php | 2 +- .../Adminhtml/Product/Set/DeleteTest.php | 2 +- .../Option/Type/File/ValidatorFileTest.php | 2 +- .../Option/Type/File/ValidatorInfoTest.php | 2 +- .../Checkout/Model/Type/OnepageTest.php | 2 +- .../Model/Product/Type/ConfigurableTest.php | 2 +- .../Customer/Controller/AccountTest.php | 6 +- .../Block/Catalog/Edit/FormTest.php | 2 +- .../Block/Cms/Page/Edit/FormTest.php | 2 +- .../performance/testsuite/advanced_search.jmx | 2 +- .../Magento/Widget/_files/invalid_widget.xml | 4 +- lib/web/css/docs/actions-toolbar.html | 201 +++++++++--------- lib/web/css/docs/source/actions-toolbar.less | 6 +- lib/web/mage/validation.js | 2 +- 273 files changed, 538 insertions(+), 526 deletions(-) diff --git a/app/code/Magento/AdminNotification/Block/Window.php b/app/code/Magento/AdminNotification/Block/Window.php index e000fd732d0..21db82ec373 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/Model/System/Message/Baseurl.php b/app/code/Magento/AdminNotification/Model/System/Message/Baseurl.php index 8bed182bb26..46eb6b5f887 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 88e85643d78..e3cddcb6886 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 7462ab7c837..2070466687e 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 b51613857f2..f8db79f83d3 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/Authorization/Model/Acl/AclRetriever.php b/app/code/Magento/Authorization/Model/Acl/AclRetriever.php index e31de3cde77..615f75bda4d 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 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 a5080fd657c..620c3bbee68 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 a3d7113177a..a12377dda43 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 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 ffe91380731..874e8e3a361 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Account/Save.php @@ -56,7 +56,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 (\Magento\Framework\Validator\Exception $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 869f8af7923..cec54abf608 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 a6efb535ec2..caeb74e7c9e 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 31ef91803bb..3604948ee6b 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 aa771ac2ec8..d212d7d2f43 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteGroupPost.php @@ -20,7 +20,7 @@ class DeleteGroupPost extends \Magento\Backend\Controller\Adminhtml\System\Store $redirectResult = $this->resultRedirectFactory->create(); 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()) { @@ -33,7 +33,7 @@ class DeleteGroupPost extends \Magento\Backend\Controller\Adminhtml\System\Store } $model->delete(); - $this->messageManager->addSuccess(__('The store has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the store.')); return $redirectResult->setPath('adminhtml/*/'); } } 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 65b4ec34ccc..826f8493fa0 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 1eca177ae08..35444de6dce 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteStorePost.php @@ -21,7 +21,7 @@ class DeleteStorePost extends \Magento\Backend\Controller\Adminhtml\System\Store /** @var \Magento\Backend\Model\View\Result\Redirect $redirectResult */ $redirectResult = $this->resultRedirectFactory->create(); 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()) { @@ -37,7 +37,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/*/'); } } 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 684b10c8c23..ea67a101763 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 09c9f363b8b..cef9a5f5b93 100644 --- a/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php +++ b/app/code/Magento/Backend/Controller/Adminhtml/System/Store/DeleteWebsitePost.php @@ -22,7 +22,7 @@ class DeleteWebsitePost extends \Magento\Backend\Controller\Adminhtml\System\Sto $redirectResult = $this->resultRedirectFactory->create(); 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()) { @@ -35,7 +35,7 @@ class DeleteWebsitePost extends \Magento\Backend\Controller\Adminhtml\System\Sto } $model->delete(); - $this->messageManager->addSuccess(__('The website has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the website.')); return $redirectResult->setPath('adminhtml/*/'); } } 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 23a5e5c0fd9..f6521a418f4 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 a1bcca38c9c..7f2152e1e89 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 44907b2e8a1..5b6570aa786 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 @@ -133,7 +133,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/view/adminhtml/templates/media/uploader.phtml b/app/code/Magento/Backend/view/adminhtml/templates/media/uploader.phtml index 501591a40b0..c023bb87e4d 100644 --- a/app/code/Magento/Backend/view/adminhtml/templates/media/uploader.phtml +++ b/app/code/Magento/Backend/view/adminhtml/templates/media/uploader.phtml @@ -73,7 +73,7 @@ require([ $('#' + data.fileId) .delay(2000) .hide('highlight'); - alert($.mage.__('File extension not known or unsupported type.')); + alert($.mage.__('This file extension is not known or supported.')); } $('#' + data.fileId).remove(); }, 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 2b5d4b4b358..89f5dc34a42 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 1c9a6437041..45e939d58d5 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 35975711464..dc57f5fe5d0 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php @@ -60,8 +60,8 @@ 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( diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php index cfef7d14a15..cc5c2a93ee3 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 backups.')); } 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 d797caeebfb..438213b0dfb 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php @@ -84,8 +84,8 @@ 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( @@ -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 5d00bd24aa7..f93a2f2628a 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 back (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/view/adminhtml/layout/backup_index_block.xml b/app/code/Magento/Backup/view/adminhtml/layout/backup_index_block.xml index 1553a783f63..5b2af1a196e 100644 --- a/app/code/Magento/Backup/view/adminhtml/layout/backup_index_block.xml +++ b/app/code/Magento/Backup/view/adminhtml/layout/backup_index_block.xml @@ -24,7 +24,7 @@ <item name="delete" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Delete</item> <item name="url" xsi:type="string">backup/*/massDelete</item> - <item name="confirm" xsi:type="string" translate="true">Are you sure you want to delete the selected backup(s)?</item> + <item name="confirm" xsi:type="string" translate="true">Are you sure you want to delete he selected backups?</item> </item> </argument> </arguments> 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 ef121271e5c..5401dcbca9d 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 6c7dfa4a80d..eab043bd004 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/Model/Product/Type.php b/app/code/Magento/Bundle/Model/Product/Type.php index 1fdd7bad952..78a4dd754c6 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 cannot add this item to your shopping cart.') + __('We can\'t add this item to your shopping cart right now.') ); } } 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 faf53d7d6a7..9fe5ccb2dae 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 cannot add this item to your shopping cart.', $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 aa91cf9e455..be5e42dbdbe 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 9605342dff7..23ccd1f7084 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/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 f630eae06bb..5dc71ec3aaa 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 4edb1eb2f86..b2737e90aa1 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 3d908583e19..85ab2f080cc 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 c50b8cfdac9..e3061c2df35 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/config.xml b/app/code/Magento/Captcha/etc/config.xml index 8c91d2c706f..acb9a76cdbf 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 29f7d7227a2..96d204f7400 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 837e2ac4f81..8683c5936fc 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 52ba2586a6f..45a95f5f010 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 7f97d593503..437fd4fc2b1 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 41b5a6dbdd8..42434c7094c 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 9f6229afbb3..a932a9901c8 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 685aa481fe9..69bed2f49c6 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 ca442c0b98b..89153f5996f 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 f053cfff68c..23cce6c8cff 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, 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 e38a5d08f89..77351e6fa35 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/Controller/Adminhtml/Category/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php index 20d4ad019d5..1b01c24624e 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 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 3fbda63630e..9df8254d5e6 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 4faadeba7d3..4ad5a280d4a 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php @@ -106,7 +106,7 @@ 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(__('Product Template named \'%1\' already exists.', $name)); $this->messageManager->setAttributeData($data); return $resultRedirect->setPath('catalog/*/edit', ['_current' => true]); } catch (\Magento\Framework\Exception\LocalizedException $e) { @@ -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 4f564351eae..c7e205df237 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(__('Product Template 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 110cb1a5f75..6fe42986d14 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(__('An error occurred while deleting this set.')); 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 32c753df84a..7b9edb21c7e 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 09e77fbdec7..5870190db02 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 116c3ffca78..fa11d3ec996 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 16bdd17ffd3..161223699e8 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 cd367f0682f..e87369b13af 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 1a23f1e3519..6ff6896e166 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/Action/Row.php b/app/code/Magento/Catalog/Model/Indexer/Product/Price/Action/Row.php index 8ba30866168..1fe84aeec9c 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 3ac15cc5cd6..920b9173e0a 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 c26950c2bcf..7c5be52e6d7 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/DefaultType.php b/app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php index 41dfc06bd23..430f1ff7acb 100644 --- a/app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php +++ b/app/code/Magento/Catalog/Model/Product/Option/Type/DefaultType.php @@ -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/Validator.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/Validator.php index 33fab28e868..f0e4ef3ef50 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/Resource/Product.php b/app/code/Magento/Catalog/Model/Resource/Product.php index 6f02829d2bc..da4aee259b6 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/Setup/InstallSchema.php b/app/code/Magento/Catalog/Setup/InstallSchema.php index d2dc790edb1..d1eb9d29ad5 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 058e8edb6de..ce9dca7cfef 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 b40ffc2e186..700ffc1a8a6 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 0ed7aae857a..e99f1ae0ed1 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 27369edc624..8c266d5e681 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 df099dac7d4..82bcdf4a994 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 b0e7ede9431..97c41ca67ea 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/widget.xml b/app/code/Magento/Catalog/etc/widget.xml index 56899da4215..9317297c3e3 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 019eb3d595e..a63bc15d80e 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 40fe6a37f8e..31bc0c8da1b 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 is not 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 9f2fbc3cdd2..28bc783f49d 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 3d11c5d746d..20e1b045d7c 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 a8ee0b1f928..bb333b6f8d9 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 bb8770587f9..e2873c01dcb 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 f35de05213b..ada4c887c66 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 e0128a5f0fd..20128abd4d0 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 73131febf7b..85ed2255110 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 d728e6346f4..ecaa3dd1b64 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 f2042ea041a..ed1109ac296 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/adminhtml/web/catalog/base-image-uploader.js b/app/code/Magento/Catalog/view/adminhtml/web/catalog/base-image-uploader.js index 05b6e60c4cd..5d4bbef15ab 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/catalog/base-image-uploader.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/catalog/base-image-uploader.js @@ -124,7 +124,7 @@ define([ if (!data.result.error) { $galleryContainer.trigger('addItem', data.result); } else { - alert($.mage.__('File extension not known or unsupported type.')); + alert($.mage.__('This file extension is not known or supported.')); } }, add: function (event, data) { 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 8de6e282429..c3321016fd0 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/templates/product/compare/list.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/compare/list.phtml index 6018b36485e..486d9543f20 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/compare/list.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/compare/list.phtml @@ -80,7 +80,7 @@ <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()) : ?> <div class="secondary-addto-links actions-secondary" data-role="add-to-links"> <a href="#" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' class="action towishlist" data-action="add-to-wishlist"> - <span><?php echo __('Add to Wishlist') ?></span> + <span><?php echo __('Add to Wish List') ?></span> </a> </div> <?php endif; ?> 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 742b7521914..f2d6e222ecd 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() ?> @@ -96,12 +96,12 @@ $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\I <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()): ?> <a href="#" class="action towishlist" - title="<?php echo $block->escapeHtml(__('Add to Wishlist')); ?>" - aria-label="<?php echo $block->escapeHtml(__('Add to Wishlist')); ?>" + title="<?php echo $block->escapeHtml(__('Add to Wish List')); ?>" + aria-label="<?php echo $block->escapeHtml(__('Add to Wish List')); ?>" data-post='<?php echo $block->getAddToWishlistParams($_product); ?>' data-action="add-to-wishlist" role="button"> - <span><?php echo __('Add to Wishlist') ?></span> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php 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 e4d722b840f..7260913b0c6 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; @@ -251,8 +251,8 @@ switch ($type = $block->getType()) { <?php if ($showWishlist || $showCompare): ?> <div class="secondary-addto-links actions-secondary" data-role="add-to-links"> <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow() && $showWishlist): ?> - <a href="#" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' class="action towishlist" data-action="add-to-wishlist" title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + <a href="#" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' class="action towishlist" data-action="add-to-wishlist" title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> 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 6431fceac5a..564bcad2f3a 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() ?> @@ -71,7 +71,7 @@ $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\I $info['links'] = '<div class="product links" data-role="add-to-links">' . '<a href="#" data-post=\'' . $this->helper('Magento\Wishlist\Helper\Data')->getAddParams($_product) . '\' class="action towishlist" data-action="add-to-wishlist">' - . '<span>' . __('Add to Wishlist') . '</span></a>' + . '<span>' . __('Add to Wish List') . '</span></a>' . '<a href="' . $block->getAddToCompareUrl($_product) . '" class="action tocompare">' . '<span>' . __('Add to Compare') . '</span></a></div>'; $info['actions'] = '<div class="product action">' . $info['button'] . $info['links'] . '</div>'; diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/view/addto.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/view/addto.phtml index 9cc99cbb34f..547c54ef0a1 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/view/addto.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/view/addto.phtml @@ -18,9 +18,9 @@ $compareHelper = $this->helper('Magento\Catalog\Helper\Product\Compare'); <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()) : ?> <a href="#" class="action towishlist" - title="<?php echo __('Add to Wishlist') ?>" + title="<?php echo __('Add to Wish List') ?>" data-post='<?php echo $_wishlistSubmitParams; ?>' - data-action="add-to-wishlist"><span><?php echo __('Add to Wishlist') ?></span></a> + data-action="add-to-wishlist"><span><?php echo __('Add to Wish List') ?></span></a> <?php endif; ?> <a href="#" data-post='<?php echo $compareHelper->getPostDataParams($_product);?>' data-role="add-to-links" 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 39485ad90b9..e804e0833a5 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 5d78983a248..719d4ee3391 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 408b5cf67e0..9e8165e3da4 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/templates/product/widget/new/content/new_grid.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/widget/new/content/new_grid.phtml index 2061919c2ff..bf2056e6bf8 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/widget/new/content/new_grid.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/widget/new/content/new_grid.phtml @@ -100,8 +100,8 @@ if ($exist = ($block->getProductCollection() && $block->getProductCollection()-> <a href="#" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' class="action towishlist" data-action="add-to-wishlist" - title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> diff --git a/app/code/Magento/Catalog/view/frontend/templates/product/widget/new/content/new_list.phtml b/app/code/Magento/Catalog/view/frontend/templates/product/widget/new/content/new_list.phtml index be45c6d5b42..14e3c3a0361 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/widget/new/content/new_list.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/widget/new/content/new_list.phtml @@ -99,8 +99,8 @@ if ($exist = ($block->getProductCollection() && $block->getProductCollection()-> <a href="#" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' class="action towishlist" data-action="add-to-wishlist" - title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> 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 8f6a31c3235..3e07b5d95d3 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/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index 2a2a7bafff8..d3bdc5557d7 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -110,7 +110,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity 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_ATTR_SET => 'Invalid value for Product Template column (set does not exists?)', 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", @@ -120,7 +120,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity 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 1f0e83871d4..750e033865b 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php @@ -371,33 +371,33 @@ 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 correct the value for store.')); + $this->_productEntity->addMessageTemplate(self::ERROR_INVALID_TYPE, __('Please correct the value for type.')); + $this->_productEntity->addMessageTemplate(self::ERROR_EMPTY_TITLE, __('Please enter a value for title.')); + $this->_productEntity->addMessageTemplate(self::ERROR_INVALID_PRICE, __('Please correct the value for price.')); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_MAX_CHARACTERS, - __('Invalid custom option maximum characters value.') + __('Please correct the value for maximum characters value.') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_SORT_ORDER, - __('Invalid custom option sort order.') + __('Please correct the value for sort order.') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_PRICE, - __('Invalid custom option value price.') + __('Please correct the value for value price.') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_SORT, - __('Invalid custom option value sort order.') + __('Please correct the value for value sort order.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_NEW_NAMES, - __('Custom option with such title already declared in source file.') + __('A custom option with this title already exists in source file.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_OLD_NAMES, - __('There are several existing custom options with such name.') + __('Several custom options with this name already exist.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_TYPES, @@ -473,7 +473,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/Indexer/Stock/Action/Row.php b/app/code/Magento/CatalogInventory/Model/Indexer/Stock/Action/Row.php index 0103d0849f8..30a07b0eaea 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 2f1c028dc6f..40f3a1f7562 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/StockStateProvider.php b/app/code/Magento/CatalogInventory/Model/StockStateProvider.php index be14f0ea697..cc613bb9413 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/Model/Indexer/Stock/Action/RowTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Indexer/Stock/Action/RowTest.php index 9a2bb4ec376..bc564f6c717 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/etc/adminhtml/system.xml b/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml index b72ac2c3793..3244113f95c 100644 --- a/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml +++ b/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml @@ -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/view/frontend/templates/qtyincrements.phtml b/app/code/Magento/CatalogInventory/view/frontend/templates/qtyincrements.phtml index 999ba49d40a..2261d062a8f 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 9c06d2257e6..e268ba220a9 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 a1c7136d74c..7eac125efea 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 b51ba93f763..a0ac81cb1af 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 (do not add conditions if rule applies to all products))')] )->setRenderer( $renderer ); diff --git a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Main.php b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Main.php index 60c9971f2da..8fccd845796 100644 --- a/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Main.php +++ b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Main.php @@ -194,8 +194,8 @@ class Main extends Generic implements TabInterface 'date', [ 'name' => 'from_date', - 'label' => __('From Date'), - 'title' => __('From Date'), + 'label' => __('Start Date'), + 'title' => __('Start Date'), 'input_format' => \Magento\Framework\Stdlib\DateTime::DATE_INTERNAL_FORMAT, 'date_format' => $dateFormat ] diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php index 3b20dec460b..328482c1198 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php @@ -94,7 +94,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 56438a823ee..ac6b03e71c5 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.'); /** @var Job $ruleJob */ $ruleJob = $this->_objectManager->get('Magento\CatalogRule\Model\Rule\Job'); $ruleJob->applyAll(); 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 008b21e02ea..c24d1743e48 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php @@ -23,21 +23,21 @@ 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) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addError( - __('An error occurred while deleting the rule. Please review the log and try again.') + __('Something went wrong while deleting the rule. Please check the log and try again.') ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $this->_redirect('catalog_rule/*/edit', ['id' => $this->getRequest()->getParam('id')]); 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 4dbf0caea9d..97495f7d0d4 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 d6c52a615cd..fd6533a042c 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 383bda38d59..46a8744cf4c 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/Model/Indexer/AbstractIndexer.php b/app/code/Magento/CatalogRule/Model/Indexer/AbstractIndexer.php index 13dc23422a5..dd32624a899 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/Plugin/Indexer/Product/Attribute.php b/app/code/Magento/CatalogRule/Plugin/Indexer/Product/Attribute.php index 254ac9fdbff..4a4450057ea 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 610434b70a4..edb7b48b33b 100644 --- a/app/code/Magento/CatalogRule/Setup/InstallSchema.php +++ b/app/code/Magento/CatalogRule/Setup/InstallSchema.php @@ -56,7 +56,7 @@ class InstallSchema implements InstallSchemaInterface \Magento\Framework\DB\Ddl\Table::TYPE_DATE, null, [], - 'From Date' + 'Start Date' ) ->addColumn( 'to_date', 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 dfec1c047ab..c000ae21d09 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/etc/acl.xml b/app/code/Magento/CatalogRule/etc/acl.xml index c5216b6f585..3f8941d24f7 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 29cde11d5c0..cb0545bf17e 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 a573a9a02d6..e96c86c5f8a 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 9f1c2cec4bc..92fe9a3e3c1 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/CatalogWidget/view/frontend/templates/product/widget/content/grid.phtml b/app/code/Magento/CatalogWidget/view/frontend/templates/product/widget/content/grid.phtml index 1acdd16634d..e8c7579eab6 100644 --- a/app/code/Magento/CatalogWidget/view/frontend/templates/product/widget/content/grid.phtml +++ b/app/code/Magento/CatalogWidget/view/frontend/templates/product/widget/content/grid.phtml @@ -101,8 +101,8 @@ <a href="#" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' class="action towishlist" data-action="add-to-wishlist" - title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> diff --git a/app/code/Magento/Checkout/Controller/Cart/Add.php b/app/code/Magento/Checkout/Controller/Cart/Add.php index 6bf5cecdfb0..05bafe1daa1 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 f3f8a349b6a..44260ba75a5 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 2b93e3d1cb1..15b6cd8508b 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.')); } return $this->_goBack(); diff --git a/app/code/Magento/Checkout/Controller/Cart/Delete.php b/app/code/Magento/Checkout/Controller/Cart/Delete.php index 8b5e2da9ce3..3d73a5f0c20 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 83b56954111..f3a64d2a6c3 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.')); $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 31d94cb6230..324cd788a97 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 5e16fbd5f2f..991511fc022 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/Model/Cart.php b/app/code/Magento/Checkout/Model/Cart.php index b023e8eda14..c96372b08de 100644 --- a/app/code/Magento/Checkout/Model/Cart.php +++ b/app/code/Magento/Checkout/Model/Cart.php @@ -519,7 +519,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 ff24c18f2be..b8610f26fc9 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 e-mail for the confirmation link or <a href="%1">click here</a> for a new link.', $url ) // @codingStandardsIgnoreEnd 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 d9e8d61c507..b17b2423c18 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 d34488d2b67..082a99c36c3 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -26,7 +26,7 @@ <tr> <th class="col item" scope="col"><span><?php echo __('Item') ?></span></th> <th class="col price" scope="col"><span><?php echo __('Price') ?></span></th> - <th class="col qty" scope="col"><span><?php echo __('Qty') ?></span></th> + <th class="col qty" scope="col"><span><?php echo __('Quantity') ?></span></th> <th class="col subtotal" scope="col"><span><?php echo __('Subtotal') ?></span></th> </tr> </thead> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml index 014c5666c69..7e0bd3d5de8 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml @@ -15,9 +15,9 @@ <fieldset class="fieldset"> <?php if ($block->shouldRenderQuantity()): ?> <div class="field qty"> - <label class="label" for="qty"><span><?php echo __('Qty') ?></span></label> + <label class="label" for="qty"><span><?php echo __('Quantity') ?></span></label> <div class="control"> - <input type="number" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty() * 1 ?>" title="<?php echo __('Qty') ?>" class="input-text qty" data-validate="{'required-number':true,digits:true}"/> + <input type="number" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty() * 1 ?>" title="<?php echo __('Quantity') ?>" class="input-text qty" data-validate="{'required-number':true,digits:true}"/> </div> </div> <?php endif; ?> 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 7d0ceffcb8b..1f1929ec90a 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 @@ -85,10 +85,10 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <?php $cols++; ?> </td> <?php endif; ?> - <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Qty')); ?>"> + <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Quantity')); ?>"> <div class="field qty"> <label class="label" for="cart-<?php echo $_item->getId() ?>-qty"> - <span><?php echo __('Qty') ?></span> + <span><?php echo __('Quantity') ?></span> </label> <div class="control qty"> <input id="cart-<?php echo $_item->getId() ?>-qty" @@ -96,7 +96,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima value="<?php echo $block->getQty() ?>" type="number" size="4" - title="<?php echo $block->escapeHtml(__('Qty')); ?>" + title="<?php echo $block->escapeHtml(__('Quantity')); ?>" class="input-text qty" maxlength="12" data-validate="{required:true,'validate-greater-than-zero':true}" @@ -124,7 +124,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <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 Wishlist'); ?></span> + <span><?php echo __('Move to Wish List'); ?></span> </a> <?php endif ?> <?php endif ?> diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml index 410eb152883..04c6ccf52d5 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml @@ -22,7 +22,7 @@ <tr> <th class="col item" scope="col"><?php echo __('Product Name') ?></th> <th class="col price" scope="col"><?php echo __('Price') ?></th> - <th class="col qty" scope="col"><?php echo __('Qty') ?></th> + <th class="col qty" scope="col"><?php echo __('Quantity') ?></th> <th class="col subtotal" scope="col"><?php echo __('Subtotal') ?></th> </tr> </thead> diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml index 1c341f5cf30..ed1d109353d 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml @@ -48,7 +48,7 @@ $_item = $block->getItem(); </span> <?php endif; ?> </td> - <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Qty'));?>"><span class="qty"><?php echo $_item->getQty() ?></span></td> + <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Quantity'));?>"><span class="qty"><?php echo $_item->getQty() ?></span></td> <td class="col subtotal" data-th="<?php echo $block->escapeHtml(__('Subtotal'));?>"> <?php if ($this->helper('Magento\Tax\Helper\Data')->displayCartPriceInclTax() || $this->helper('Magento\Tax\Helper\Data')->displayCartBothPrices()): ?> <span class="price-including-tax" data-label="<?php echo $block->escapeHtml(__('Incl. Tax'));?>"> 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 257d8bab74f..589f30facbd 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.') ?></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 b4d0bba7142..9a5162afc57 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 899f38b32e1..059595059e5 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.__('Please choose to register or to checkout 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 c590c9835a3..cb3fdb70ebb 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/opc-shipping-method.js b/app/code/Magento/Checkout/view/frontend/web/js/opc-shipping-method.js index 074ee318a67..1fab57f3c10 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/opc-shipping-method.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/opc-shipping-method.js @@ -63,7 +63,7 @@ define([ _validateShippingMethod: function() { var methods = this.element.find('[name="shipping_method"]'); if (methods.length === 0) { - alert($.mage.__('We are not able to ship to the selected shipping address. Please choose another address or edit the current address.')); + alert($.mage.__('We can\'t ship to this address. Please choose another address or edit the current address.')); return false; } if (methods.filter(':checked').length) { 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 0cad0456668..3f0274d551b 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.__('Please choose to register or to checkout 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 are not able to ship to the selected shipping address. Please choose another address or edit the current address.')); + alert($.mage.__('We can\'t ship to this address. Please choose another address or edit the current address.')); 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 f306e375d47..ae364e159b4 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/view/minicart.js b/app/code/Magento/Checkout/view/frontend/web/js/view/minicart.js index 322718862d9..373056b389e 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/js/view/review/item/columns/qty.js b/app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js index c3352464d34..9933898fcd2 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js @@ -13,7 +13,7 @@ define( return column.extend({ defaults: { ownClass: 'qty', - columnTitle: 'Qty', + columnTitle: 'Quantity', template: 'Magento_Checkout/review/item/columns/qty' }, getValue: function(quoteItem) { 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 c54065bab25..b9739ff9bc3 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"> 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 a846c85deb4..c8600c9cf28 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> @@ -69,7 +69,7 @@ <!-- /ko --> <div class="details-qty qty"> - <span class="label" data-bind="text: $t('Qty')"></span> + <span class="label" data-bind="text: $t('Quantity')"></span> <input data-bind="attr: { id: 'cart-item-'+item_id+'-qty', 'data-cart-item': item_id, 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 af506619bda..2831a845897 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/review/item/columns/qty.html b/app/code/Magento/Checkout/view/frontend/web/template/review/item/columns/qty.html index cc5e4d63f78..87b6591f188 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/review/item/columns/qty.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/review/item/columns/qty.html @@ -4,4 +4,4 @@ * See COPYING.txt for license details. */ --> -<td class="col qty" data-th="Qty"><span class="qty" data-bind="text: item.qty"></span></td> \ No newline at end of file +<td class="col qty" data-th="Quantity"><span class="qty" data-bind="text: item.qty"></span></td> \ No newline at end of file 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 3bb9342bc57..4de0ed844a8 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.')--><!-- /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 9be4d20c91f..5341f0a0b6b 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 } $model->delete(); - $this->messageManager->addSuccess(__('The condition has been deleted.')); + $this->messageManager->addSuccess(__('You deleted the condition.')); $this->_redirect('checkout/*/'); } } diff --git a/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php b/app/code/Magento/CheckoutAgreements/Controller/Adminhtml/Agreement/Save.php index ddd125d419f..760a465693f 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 c5bf68c00e1..107b5f4eb9e 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 1fe7e266c91..c6e17f07cbf 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 46b0998de61..6858ef9cadf 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 2adc979aaca..f0aad1f1a5b 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/Config/Controller/Adminhtml/System/Config/Save.php b/app/code/Magento/Config/Controller/Adminhtml/System/Config/Save.php index f5969841a7d..51e7cbab93d 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() + __('ASomething 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 c2030b1c734..35e8e5688ca 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 68cdb235bde..66e00832b83 100644 --- a/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php +++ b/app/code/Magento/ConfigurableProduct/Model/OptionRepository.php @@ -209,14 +209,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 c1fb0b41ef4..867ad33a9ab 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php @@ -864,7 +864,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/Test/Unit/Model/Product/Type/ConfigurableTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/Product/Type/ConfigurableTest.php index 4ca090adef4..9232aa4ac01 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 @@ -556,7 +556,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 f1445c3798d..486bd4943db 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/matrix.phtml b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/matrix.phtml index b7beb5d05ed..e4abf83c46b 100644 --- a/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/matrix.phtml +++ b/app/code/Magento/ConfigurableProduct/view/adminhtml/templates/catalog/product/edit/super/matrix.phtml @@ -296,7 +296,7 @@ jQuery(function ($) { parentElement.find('[name$="[image]"]').val(data.result.file); parentElement.find('[data-toggle=dropdown]').show(); } else { - alert($.mage.__('File extension not known or unsupported type.')); + alert($.mage.__('This file extension is not known or supported.')); } }, start: function(event) { 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 a9c558ad9ce..65f7e2df168 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 9212be28ee6..19234616a0e 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/Customer/Controller/Account/CreatePost.php b/app/code/Magento/Customer/Controller/Account/CreatePost.php index c132eb904d1..988beb09148 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 e-mail for the confirmation link or <a href="%1">click here</a> for a new link.', $email ) ); diff --git a/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php b/app/code/Magento/Customer/Controller/Adminhtml/Index/Save.php index 986895f4d7c..7e5dfa94645 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/view/adminhtml/templates/tab/cart.phtml b/app/code/Magento/Customer/view/adminhtml/templates/tab/cart.phtml index a25f849851d..7c3f93191d4 100644 --- a/app/code/Magento/Customer/view/adminhtml/templates/tab/cart.phtml +++ b/app/code/Magento/Customer/view/adminhtml/templates/tab/cart.phtml @@ -55,7 +55,7 @@ require([ alert('<?php echo $block->escapeJsQuote(__('No item specified.')) ?>'); return false; } - if(!confirm('<?php echo $block->escapeJsQuote(__('Are you sure that you want to remove this item?')) ?>')) { + if(!confirm('<?php echo $block->escapeJsQuote(__('Are you sure you want to remove this item?')) ?>')) { return false; } 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 b1b38150bd6..62441265c74 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 @@ -107,7 +107,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <?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 Wishlist'); ?></span> + <span><?php echo __('Move to Wish List'); ?></span> </a> <?php endif ?> <?php endif ?> diff --git a/app/code/Magento/Integration/Model/AuthorizationService.php b/app/code/Magento/Integration/Model/AuthorizationService.php index 4eb1b5fb015..5353338a59e 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,7 @@ 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 deleting roles and permissions. You can find out more in the exceptions log.') ); } } 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 e9bca9477d8..a7ebd5157d6 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/shipping.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/shipping.phtml index 105b8b416e6..d6ba87cbd08 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.') ?></p> <?php else: ?> <dl class="items methods-shipping"> <?php $_sole = count($_shippingRateGroups) == 1; foreach ($_shippingRateGroups as $code => $_rates): ?> diff --git a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Save.php index 3e83573ff78..e70b3a8809c 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/Payment/view/adminhtml/templates/transparent/info.phtml b/app/code/Magento/Payment/view/adminhtml/templates/transparent/info.phtml index badfd92d13a..6eccac93aca 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 badfd92d13a..6eccac93aca 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/Reports/view/frontend/templates/product/widget/viewed/item.phtml b/app/code/Magento/Reports/view/frontend/templates/product/widget/viewed/item.phtml index 47e2cf321ce..92ec5562534 100644 --- a/app/code/Magento/Reports/view/frontend/templates/product/widget/viewed/item.phtml +++ b/app/code/Magento/Reports/view/frontend/templates/product/widget/viewed/item.phtml @@ -71,8 +71,8 @@ $rating = 'short'; <div class="secondary-addto-links" data-role="add-to-links"> <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()): ?> - <a href="#" data-post='<?php echo $block->getAddToWishlistParams($item); ?>' class="action towishlist" data-action="add-to-wishlist" title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + <a href="#" data-post='<?php echo $block->getAddToWishlistParams($item); ?>' class="action towishlist" data-action="add-to-wishlist" title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl()): ?> diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml index 049c254f8e1..f0fa5daabd6 100644 --- a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml +++ b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_grid.phtml @@ -102,8 +102,8 @@ if ($exist = $block->getRecentlyComparedProducts()) { data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' data-action="add-to-wishlist" class="action towishlist" - title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml index 7da7a3fa019..bbad16529bb 100644 --- a/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml +++ b/app/code/Magento/Reports/view/frontend/templates/widget/compared/content/compared_list.phtml @@ -103,8 +103,8 @@ if ($exist = $block->getRecentlyComparedProducts()) { data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' data-action="add-to-wishlist" class="action towishlist" - title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml index d63d0f976b6..0d2dbdb5ebe 100644 --- a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml +++ b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_grid.phtml @@ -102,8 +102,8 @@ if ($exist = ($block->getRecentlyViewedProducts() && $block->getRecentlyViewedPr <a href="#" class="action towishlist" data-action="add-to-wishlist" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' - title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> diff --git a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml index 055e30e68a0..de44d8433d8 100644 --- a/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml +++ b/app/code/Magento/Reports/view/frontend/templates/widget/viewed/content/viewed_list.phtml @@ -105,8 +105,8 @@ if ($exist = ($block->getRecentlyViewedProducts() && $block->getRecentlyViewedPr <a href="#" class="action towishlist" data-action="add-to-wishlist" data-post='<?php echo $block->getAddToWishlistParams($_item); ?>' - title="<?php echo __('Add to Wishlist') ?>"> - <span><?php echo __('Add to Wishlist') ?></span> + title="<?php echo __('Add to Wish List') ?>"> + <span><?php echo __('Add to Wish List') ?></span> </a> <?php endif; ?> <?php if ($block->getAddToCompareUrl() && $showCompare): ?> diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php b/app/code/Magento/Review/Controller/Adminhtml/Product/Post.php index 6a332eb52ef..9003d2ee30c 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 review.')); } } $resultRedirect->setPath('review/*/'); 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 e9099009515..4bd18e568a2 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/Sales/Controller/AbstractController/Reorder.php b/app/code/Magento/Sales/Controller/AbstractController/Reorder.php index 7010d3bd5c0..bf86825d8b4 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 cannot add this item to your shopping cart.')); + $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/Model/AdminOrder/Create.php b/app/code/Magento/Sales/Model/AdminOrder/Create.php index a661297a73a..e6f2a0a1052 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( 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 5b56da82d49..447486bbe48 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 @@ -153,9 +153,9 @@ <?php if ($block->isMoveToWishlistAllowed($_item)): ?> <?php $wishlists = $block->getCustomerWishlists();?> <?php if (count($wishlists) <= 1):?> - <option value="wishlist"><?php echo __('Move to Wishlist') ?></option> + <option value="wishlist"><?php echo __('Move to Wish List') ?></option> <?php else: ?> - <optgroup label="<?php echo __('Move to Wishlist') ?>"> + <optgroup label="<?php echo __('Move to Wish List') ?>"> <?php foreach ($wishlists as $wishlist):?> <option value="wishlist_<?php echo $wishlist->getId();?>"><?php echo $block->escapeHtml($wishlist->getName());?></option> <?php endforeach;?> 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 af3849077c6..f1ef4bd6c05 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 e6c5dcc4af7..de5b18e8c15 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php @@ -21,14 +21,14 @@ 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) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addError( - __('An error occurred while deleting the rule. Please review the log and try again.') + __('Something went wrong while deleting the rule. Please check the log and try again.') ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $this->_redirect('sales_rule/*/edit', ['id' => $this->getRequest()->getParam('id')]); 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 6a507241d59..055668dc165 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/Helper/Data.php b/app/code/Magento/Search/Helper/Data.php index f29486cf034..93939b5d5e4 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/UrlRewrite/Block/Catalog/Edit/Form.php b/app/code/Magento/UrlRewrite/Block/Catalog/Edit/Form.php index 72896f855e5..8ac824f7749 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 e3e28f33127..5ebbfd8f76e 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 56fb10b39a5..8a6493ca816 100644 --- a/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php +++ b/app/code/Magento/UrlRewrite/Controller/Adminhtml/Url/Rewrite/Delete.php @@ -18,9 +18,9 @@ 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, __('An error occurred while deleting URL Rewrite.')); + $this->messageManager->addException($e, __('Something went wrong while deleting URL rewrite.')); $this->_redirect('adminhtml/*/edit/', ['id' => $this->_getUrlRewrite()->getId()]); return; } 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 8ca7008efc0..951b0885f72 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/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 599d7090877..895d24c39df 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 c244c34fcd6..fa900ef262a 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 aa5c38559b7..0e46e952e94 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 aa0dc8fc356..bdb9d5253af 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 86215bdc615..c8292b04587 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 14fe72fb68f..f4435da5188 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 048dd29fe02..0f38316c1be 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 ebe9db5b911..f15ae2b8ae0 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 cfc024de598..bfaa8c3f176 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 175b2968e14..1a672820732 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 23b609a0e5b..d281c60358d 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/Model/ItemCarrier.php b/app/code/Magento/Wishlist/Model/ItemCarrier.php index dff865ca56a..5fbc609a369 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 cannot add this item to your shopping cart.'); + $messages[] = __('We can\'t add this item to your shopping cart right now.'); } } diff --git a/app/code/Magento/Wishlist/view/adminhtml/templates/customer/edit/tab/wishlist.phtml b/app/code/Magento/Wishlist/view/adminhtml/templates/customer/edit/tab/wishlist.phtml index d854edd848c..46849180241 100644 --- a/app/code/Magento/Wishlist/view/adminhtml/templates/customer/edit/tab/wishlist.phtml +++ b/app/code/Magento/Wishlist/view/adminhtml/templates/customer/edit/tab/wishlist.phtml @@ -48,7 +48,7 @@ wishlistControl = { }, removeItem: function (itemId) { - if(!confirm('<?php echo __('Are you sure that you want to remove this item?') ?>')) { + if(!confirm('<?php echo __('Are you sure you want to remove this item?') ?>')) { return false; } this.reload('&delete=' + itemId); 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 a4c5d416a35..11ce019d59d 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/shared.phtml b/app/code/Magento/Wishlist/view/frontend/templates/shared.phtml index 9a94c0a1938..613d03e8aeb 100644 --- a/app/code/Magento/Wishlist/view/frontend/templates/shared.phtml +++ b/app/code/Magento/Wishlist/view/frontend/templates/shared.phtml @@ -58,7 +58,7 @@ $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\I <?php endif ?> <?php endif; ?> <a href="#" data-post='<?php echo $block->getAddToWishlistParams($item); ?>' onclick="location.assign(this.href); return false;" class="action towishlist" data-action="add-to-wishlist"> - <span><?php echo __('Add to Wishlist') ?></span> + <span><?php echo __('Add to Wish List') ?></span> </a> </td> </tr> diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php index a1a2c4de266..f6bea81a529 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php @@ -156,7 +156,7 @@ class AttributeSetManagementTest extends WebapiAbstract $entityTypeCode = 'catalog_product'; $entityType = $this->getEntityTypeByCode($entityTypeCode); $attributeSetName = 'Default'; - $expectedMessage = 'An attribute set with the "Default" name already exists.'; + $expectedMessage = 'Product template named "Default" already exists.'; $arguments = [ 'attributeSet' => [ 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 81e31a383e3..e9c79011e8a 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 a18ca9cdd59..e41e1b4ab6d 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 f457daa8974..4a634c7d23d 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 5e8a4e08034..281327b9f8c 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 6169fe31598..ed7b1ec0e51 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.' + 'Product Template 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 e1aba5f1afe..86ef5f17420 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 a17b7771168..43cff91896a 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 b12adf4ec6d..457cac5b708 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/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php b/dev/tests/functional/tests/app/Magento/CatalogRule/Test/Constraint/AssertCatalogPriceRuleNoticeMessage.php index b2bfa44e709..8609e5acd33 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 58ec4e80635..f8531c5540c 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 ef3f54ac988..a1cdb0e31bd 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 88c2147c46a..f76cebd5e05 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 3425b84fc72..8ebd1ad9f3a 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 be8f327ca8f..1991317d9d1 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 9a55206423b..86f7da0d73c 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 91556d40fba..22d58096d2c 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 b3ba80fd810..5f8e83c2386 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 8ca777197b9..9f1e3a665ff 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 fb9e01f128d..c0d52d294ef 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 c2c64fd6903..77da7feb3be 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 44de7307878..ed337c38d0c 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 c56571f7603..c1688d50dc6 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 0fc7096428d..eb57e0ac471 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 d497fc4c888..ba715ffa968 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 36d25d1c49f..965b7fe07cc 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 615c4b06fb4..1c2696d6ed3 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 e047e5de15a..c57528db373 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/Fedex/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml index 2c81ac17aec..5ea75d0854c 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">customer_UK</data> 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 4e211b830f1..91bc3f52253 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/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php b/dev/tests/functional/tests/app/Magento/SalesRule/Test/Constraint/AssertCartPriceRuleSuccessDeleteMessage.php index 4c507b9605f..2cf4cfb37d7 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 409498a5926..6c0484f965e 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 4a3c4915771..7d101ed70c6 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 91309d808a1..ea9be6f761b 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 6c20ef82133..5be639d9d92 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 83af2e7c0c8..30993d6f2fc 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 16787f9051b..82dd5459f8b 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 1adf2c2eb6e..cf467e88cb5 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 451dd0cc5dd..c5c6a7d2d48 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 0ba9aa0762e..11d54478e8d 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 177029571c7..2078e611262 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 850c839e08f..e69a07836fa 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">customer_UK</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 8542c0fa9b0..ac453e2ebdc 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 db8db09e418..f374414df10 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">customer_UK</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 5f427ca5531..b883caecd3a 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" tool tip. * * @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 9119a7273c8..26d9c424c08 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" tool tip. */ 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 0748d08846e..afb1cce8871 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" tool tip. */ 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" tool tip. * * @param CmsIndex $cmsIndex * @param WishlistIndex $wishlistIndex 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 6f775b962bf..6f4ab16528d 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.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 saving the category.']), \Magento\Framework\Message\MessageInterface::TYPE_ERROR ); } 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 a8f2d376d96..062f0b5d71b 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 @@ -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/Model/Product/Option/Type/File/ValidatorFileTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFileTest.php index 96833ea6131..4999c68d059 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 @@ -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 d0a5bdb5bdf..157b01ec429 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 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 aa5dc67e9df..36d6810d4b2 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/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php b/dev/tests/integration/testsuite/Magento/ConfigurableProduct/Model/Product/Type/ConfigurableTest.php index ab40348430e..504925718be 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/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index ad67b6d54c8..6e0482828b1 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -194,10 +194,8 @@ 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 e-mail for the confirmation link or <a href="' + . $email . '">click here</a> for a new link.', ]), MessageInterface::TYPE_SUCCESS ); 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 d4780d259aa..cf3101240d2 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 8eb255b89d9..f84835366f0 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/performance/testsuite/advanced_search.jmx b/dev/tests/performance/testsuite/advanced_search.jmx index 9b9679b2311..99aa94c587a 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 9648839a4b6..98ee95ccfa0 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/lib/web/css/docs/actions-toolbar.html b/lib/web/css/docs/actions-toolbar.html index 45405f0d0fd..361cd94d46f 100644 --- a/lib/web/css/docs/actions-toolbar.html +++ b/lib/web/css/docs/actions-toolbar.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>actions-toolbar | 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="actions-toolbar" class="section"><div class="docs"><a href="#actions-toolbar" 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="actions-toolbar">Actions toolbar</h1> <p> Actions toolbar is a set of actions on a page, form and so on that includes primary and/or secondary actions. @@ -29,15 +29,16 @@ </button> </div> </div></textarea> -</div><div class="code"><pre><code> -.actions-toolbar { - .actions-toolbar(); -} - -.example-actions-toolbar-1 { - .actions-toolbar(); -} - </code></pre></div></article><article id="actions-toolbar-mixin-variables" class="section"><div class="docs"><a href="#actions-toolbar-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="actions-toolbar-mixin-variables">Actions toolbar mixin variables</h1> +</div><div class="code"><pre><code> +.actions-toolbar { + .actions-toolbar(); +} + +.example-actions-toolbar-1 { + .actions-toolbar(); +} + +</code></pre></div></article><article id="actions-toolbar-mixin-variables" class="section"><div class="docs"><a href="#actions-toolbar-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="actions-toolbar-mixin-variables">Actions toolbar mixin variables</h1> <pre> <table> <tr> @@ -148,31 +149,32 @@ <a class="action back" href="#"><span>Back</span></a> </div> </div></textarea> -</div><div class="code"><pre><code> -.example-actions-toolbar-2 { - .actions-toolbar( - @_actions-toolbar-actions-position: justify - ); -} - -.example-actions-toolbar-3 { - .actions-toolbar( - @_actions-toolbar-actions-position: left - ); -} - -.example-actions-toolbar-4 { - .actions-toolbar( - @_actions-toolbar-actions-position: right - ); -} - -.example-actions-toolbar-5 { - .actions-toolbar( - @_actions-toolbar-actions-position: center - ); -} - </code></pre></div></article><article id="reverse-primary-and-secondary-blocks" class="section"><div class="docs"><a href="#reverse-primary-and-secondary-blocks" 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="reverse-primary-and-secondary-blocks">Reverse primary and secondary blocks</h1> +</div><div class="code"><pre><code> +.example-actions-toolbar-2 { + .actions-toolbar( + @_actions-toolbar-actions-position: justify + ); +} + +.example-actions-toolbar-3 { + .actions-toolbar( + @_actions-toolbar-actions-position: left + ); +} + +.example-actions-toolbar-4 { + .actions-toolbar( + @_actions-toolbar-actions-position: right + ); +} + +.example-actions-toolbar-5 { + .actions-toolbar( + @_actions-toolbar-actions-position: center + ); +} + +</code></pre></div></article><article id="reverse-primary-and-secondary-blocks" class="section"><div class="docs"><a href="#reverse-primary-and-secondary-blocks" 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="reverse-primary-and-secondary-blocks">Reverse primary and secondary blocks</h1> <p> <code>@_actions-toolbar-actions-reverse</code> variable controls reversing of primary and secondary blocks.</p> <p> If it is set to <code>false</code>, the order of blocks in action toolbar is <strong>default</strong>.</p> <p> If it is set to <code>true</code>, the order of blocks in action toolbar is <strong>reversed</strong>.</p> @@ -207,28 +209,29 @@ <a class="action back" href="#"><span>Back</span></a> </div> </div></textarea> -</div><div class="code"><pre><code> -.example-actions-toolbar-6 { - .actions-toolbar( - @_actions-toolbar-actions-position: justify, - @_actions-toolbar-actions-reverse: true - ); -} - -.example-actions-toolbar-7 { - .actions-toolbar( - @_actions-toolbar-actions-position: left, - @_actions-toolbar-actions-reverse: true - ); -} - -.example-actions-toolbar-8 { - .actions-toolbar( - @_actions-toolbar-actions-position: right, - @_actions-toolbar-actions-reverse: true - ); -} - </code></pre></div></article><article id="actions-toolbar-indents-customizations" class="section"><div class="docs"><a href="#actions-toolbar-indents-customizations" 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="actions-toolbar-indents-customizations">Actions toolbar indents customizations</h1> +</div><div class="code"><pre><code> +.example-actions-toolbar-6 { + .actions-toolbar( + @_actions-toolbar-actions-position: justify, + @_actions-toolbar-actions-reverse: true + ); +} + +.example-actions-toolbar-7 { + .actions-toolbar( + @_actions-toolbar-actions-position: left, + @_actions-toolbar-actions-reverse: true + ); +} + +.example-actions-toolbar-8 { + .actions-toolbar( + @_actions-toolbar-actions-position: right, + @_actions-toolbar-actions-reverse: true + ); +} + +</code></pre></div></article><article id="actions-toolbar-indents-customizations" class="section"><div class="docs"><a href="#actions-toolbar-indents-customizations" 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="actions-toolbar-indents-customizations">Actions toolbar indents customizations</h1> <p> <code>@_actions-toolbar-margin</code> variable controls margins of the actions toolbar wrapper.</p> <p> <code>@_actions-toolbar-padding</code> variable controls paddings of the actions toolbar wrapper.</p> <textarea class="preview-code" spellcheck="false"> <div class="example-actions-toolbar-9"> @@ -245,7 +248,7 @@ <button type="submit" class="action submit2" title="Submit2"><span>Submit2</span></button> </div> <div class="secondary"> - <a href="#" class="action towishlist"><span>Add to Wishlist</span></a> + <a href="#" class="action towishlist"><span>Add to Wish List</span></a> <a href="#" class="action tocompare"><span>Add to Compare</span></a> </div> </div></textarea><p> <code>@_actions-toolbar-secondary-actions-margin</code> variable controls margins of the secondary action elements.</p> @@ -255,48 +258,50 @@ <button type="submit" class="action submit2" title="Submit2"><span>Submit2</span></button> </div> <div class="secondary"> - <a href="#" class="action towishlist"><span>Add to Wishlist</span></a> + <a href="#" class="action towishlist"><span>Add to Wish List</span></a> <a href="#" class="action tocompare"><span>Add to Compare</span></a> </div> </div></textarea> -</div><div class="code"><pre><code> -.example-actions-toolbar-9 { - .actions-toolbar( - @_actions-toolbar-margin: 10px, - @_actions-toolbar-padding: 10px - ); -} - -.example-actions-toolbar-10 { - .actions-toolbar( - @_actions-toolbar-actions-position: left, - @_actions-toolbar-primary-actions-margin: 0 50px 0 0 - ); -} - -.example-actions-toolbar-11 { - .actions-toolbar( - @_actions-toolbar-actions-position: left, - @_actions-toolbar-secondary-actions-margin: 0 50px 0 0 - ); -} - </code></pre></div></article><article id="responsive-actions-toolbar" class="section"><div class="docs"><a href="#responsive-actions-toolbar" 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="responsive-actions-toolbar">Responsive actions toolbar</h1> +</div><div class="code"><pre><code> +.example-actions-toolbar-9 { + .actions-toolbar( + @_actions-toolbar-margin: 10px, + @_actions-toolbar-padding: 10px + ); +} + +.example-actions-toolbar-10 { + .actions-toolbar( + @_actions-toolbar-actions-position: left, + @_actions-toolbar-primary-actions-margin: 0 50px 0 0 + ); +} + +.example-actions-toolbar-11 { + .actions-toolbar( + @_actions-toolbar-actions-position: left, + @_actions-toolbar-secondary-actions-margin: 0 50px 0 0 + ); +} + +</code></pre></div></article><article id="responsive-actions-toolbar" class="section"><div class="docs"><a href="#responsive-actions-toolbar" 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="responsive-actions-toolbar">Responsive actions toolbar</h1> <p> To set up responsive action toolbar, all floats of its elements should be cleared. To do this <code> .actions-toolbar-clear-floats()</code> mixin is used.</p> <textarea class="preview-code" spellcheck="false"> <div class="example-actions-toolbar-12"> <div class="primary"> <button type="submit" class="action submit" title="Submit"><span>Submit</span></button> </div> <div class="secondary"> - <a href="#" class="action towishlist"><span>Add to Wishlist</span></a> + <a href="#" class="action towishlist"><span>Add to Wish List</span></a> </div> </div></textarea> -</div><div class="code"><pre><code> -.example-actions-toolbar-12 { - .actions-toolbar(); -} - -@media only screen and (max-width: @screen__m) { - .example-actions-toolbar-12 { - .actions-toolbar-clear-floats(); - } -} </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> +.example-actions-toolbar-12 { + .actions-toolbar(); +} + +@media only screen and (max-width: @screen__m) { + .example-actions-toolbar-12 { + .actions-toolbar-clear-floats(); + } +} +</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). --> diff --git a/lib/web/css/docs/source/actions-toolbar.less b/lib/web/css/docs/source/actions-toolbar.less index 7af58eb3403..ea3bcbdea37 100644 --- a/lib/web/css/docs/source/actions-toolbar.less +++ b/lib/web/css/docs/source/actions-toolbar.less @@ -308,7 +308,7 @@ // <button type="submit" class="action submit2" title="Submit2"><span>Submit2</span></button> // </div> // <div class="secondary"> -// <a href="#" class="action towishlist"><span>Add to Wishlist</span></a> +// <a href="#" class="action towishlist"><span>Add to Wish List</span></a> // <a href="#" class="action tocompare"><span>Add to Compare</span></a> // </div> // </div> @@ -323,7 +323,7 @@ // <button type="submit" class="action submit2" title="Submit2"><span>Submit2</span></button> // </div> // <div class="secondary"> -// <a href="#" class="action towishlist"><span>Add to Wishlist</span></a> +// <a href="#" class="action towishlist"><span>Add to Wish List</span></a> // <a href="#" class="action tocompare"><span>Add to Compare</span></a> // </div> // </div> @@ -360,7 +360,7 @@ // <button type="submit" class="action submit" title="Submit"><span>Submit</span></button> // </div> // <div class="secondary"> -// <a href="#" class="action towishlist"><span>Add to Wishlist</span></a> +// <a href="#" class="action towishlist"><span>Add to Wish List</span></a> // </div> // </div> // ``` diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js index fbcf394becd..ccc2ade46fe 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 is not complete.' ], "validate-required-datetime": [ function(v, elm, param) { -- GitLab From 01ede05161c06885e2f39d63bdfabe275430b46f Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Thu, 4 Jun 2015 09:13:09 +0300 Subject: [PATCH 042/396] MAGETWO-37630: Payment information is displayed broken on "Order Management" Backend page forms --- .../adminhtml/templates/info/purchaseorder.phtml | 9 +++++++-- .../view/adminhtml/templates/info/default.phtml | 2 +- .../templates/order/creditmemo/view/form.phtml | 2 +- .../templates/order/invoice/create/form.phtml | 2 +- .../templates/order/invoice/view/form.phtml | 2 +- .../adminhtml/templates/order/view/tab/info.phtml | 2 +- .../web/css/source/module/order/_items.less | 3 +++ .../css/source/module/order/_payment-shipping.less | 13 +++++++++++-- 8 files changed, 26 insertions(+), 9 deletions(-) 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 38ba36e0fe1..27497613b01 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/view/adminhtml/templates/info/default.phtml b/app/code/Magento/Payment/view/adminhtml/templates/info/default.phtml index b4538bd9f23..b9540f98df2 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/Sales/view/adminhtml/templates/order/creditmemo/view/form.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/creditmemo/view/form.phtml index ee8ec752df5..8302837baef 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 b0319ea9791..4eb4ec12f19 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 cd625596b54..e5a1f0617a4 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/tab/info.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/view/tab/info.phtml index b315a005397..3a8b3cf29d0 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/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 960bbd1e167..0fb9ad74b0c 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 fe3ebac4834..ea24a567ab1 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); + } +} -- GitLab From d07b84d9263de5b1da959d03653edb2b9baac453 Mon Sep 17 00:00:00 2001 From: Maksym Iakusha <miakusha@ebay.com> Date: Thu, 4 Jun 2015 10:22:44 +0300 Subject: [PATCH 043/396] MAGETWO-38011: [Nord] Unit test Coverage - Sprint 22 --- .../Test/Unit/Model/SubscriberTest.php | 205 ++++++++++++++++-- 1 file changed, 189 insertions(+), 16 deletions(-) diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/SubscriberTest.php index bd8380299a5..90d5c2ca0a4 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; + } } -- GitLab From cfa34a2a8e4b1d1d8be873b5e9f168ed04f81ff1 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Thu, 4 Jun 2015 12:30:37 +0300 Subject: [PATCH 044/396] MAGETWO-27300: Category menu items go out of screen when page side is reached - fixed delay function and improved sub-menu reverse --- .../web/css/source/module/header/actions-group/_search.less | 2 +- lib/web/mage/backend/suggest.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less index 6895895f292..ff4c338c62f 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less +++ b/app/design/adminhtml/Magento/backend/Magento_Backend/web/css/source/module/header/actions-group/_search.less @@ -96,7 +96,7 @@ font-size: @font-size__s; padding: @search-global-input__padding-top @search-global-input__padding-side @search-global-input__padding-bottom; &._active { - background-color: #ced7f6; + background-color: @color-blue-clear-sky; } } .title { diff --git a/lib/web/mage/backend/suggest.js b/lib/web/mage/backend/suggest.js index e10ed0cc5ee..3ec68c53714 100644 --- a/lib/web/mage/backend/suggest.js +++ b/lib/web/mage/backend/suggest.js @@ -19,7 +19,7 @@ factory(root.jQuery, root.mageTemplate); } }(this, function ($, mageTemplate) { - //'use strict'; + 'use strict'; /** * Implement base functionality -- GitLab From 6f1577051a2397714d968eeb124f021d73e57776 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Thu, 4 Jun 2015 13:35:19 +0300 Subject: [PATCH 045/396] MAGETWO-11129: Found records in global search in Backend can't be selected via keyboard --- lib/web/mage/backend/suggest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/mage/backend/suggest.js b/lib/web/mage/backend/suggest.js index 3ec68c53714..f4efd126939 100644 --- a/lib/web/mage/backend/suggest.js +++ b/lib/web/mage/backend/suggest.js @@ -183,6 +183,7 @@ hasSuggestedItems, hasSelectedItems, selectedItem; + switch (event.keyCode) { case keyCode.PAGE_UP: case keyCode.UP: @@ -218,7 +219,6 @@ event.currentTarget.value = selectedItem.find("a").text(); } } - break; case keyCode.TAB: if (this.isDropdownShown()) { -- GitLab From 8597f682ead6d0b61647569c48da0a63cf87d953 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 14:06:25 +0300 Subject: [PATCH 046/396] MAGETWO-38153: Implement extensible point in cart --- .../frontend/layout/checkout_cart_index.xml | 2 +- .../view/frontend/templates/cart/form.phtml | 43 +------------------ 2 files changed, 3 insertions(+), 42 deletions(-) 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 2aea829a82b..93554677907 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,7 +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.additional.options"/> + <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/templates/cart/form.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml index 8ff246adc05..4a4c2982b68 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -63,49 +63,10 @@ <?php /* Temp MAGETWO-36023 markup */?> <div class="cart-gift-item"> - <div class="gift-item-block block" - data-collapsible="true" - data-mage-init='{"collapsible":{"openedState": "_active"}}'> - <div class="title" data-role="title"> - <span><?php echo __('Gift wrap this order'); ?></span> - </div> - <div class="content" data-role="content"> - <div class="gift-options"> - <?php /* Gift Wrapping */ ?> - <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\new-options.phtml')); ?> - - <?php /* Gift Message */ ?> - <?php include ($block->getTemplateFile('Magento_GiftMessage::form.phtml')); ?> - </div> - - <?php /* Gift options applied */ ?> - <div class="gift-summary"> - <?php /* Applied Gift Wrapping */ ?> - <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\applied.phtml')); ?> - - <?php /* Applied Gift Message */ ?> - <?php include ($block->getTemplateFile('Magento_GiftMessage::applied.phtml')); ?> - - <div class="actions-toolbar"> - <div class="secondary"> - <button type="submit" - class="action action-edit" - title="<?php echo $block->escapeHtml(__('Edit')); ?>"> - <span><?php echo __('Edit'); ?></span> - </button> - <button class="action action-delete" - title="<?php echo $block->escapeHtml(__('Delete')); ?>"> - <span><?php echo __('Delete'); ?></span> - </button> - </div> - </div> - </div> - <?php /* End Gift options applied */ ?> - </div> - </div> + <?php echo $block->getChildHtml('checkout.cart.order.actions') ?> </div> <?php /* End Temp MAGETWO-36023 markup */?> <?php echo $block->getChildHtml('shopping.cart.table.after'); ?> -<?php echo $block->getChildHtml('checkout.cart.additional.options') ?> + -- GitLab From cd457aa61cb1bf35d3103d042f20f77592ccd952 Mon Sep 17 00:00:00 2001 From: Maksym Iakusha <miakusha@ebay.com> Date: Thu, 4 Jun 2015 14:35:12 +0300 Subject: [PATCH 047/396] MAGETWO-38011: [Nord] Unit test Coverage - Sprint 22 --- .../Unit/Model/Plugin/CustomerPluginTest.php | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 app/code/Magento/Newsletter/Test/Unit/Model/Plugin/CustomerPluginTest.php 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 00000000000..0c97d3ef5ef --- /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)); + } +} -- GitLab From ae29b62c85a94cdd06fddd07642668462273aed1 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 14:47:59 +0300 Subject: [PATCH 048/396] MAGETWO-38153: Implement extensible point in cart --- .../Checkout/view/frontend/templates/cart/form.phtml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) 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 4a4c2982b68..d4d58d568e5 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -60,13 +60,6 @@ <input type="hidden" value="" id="update_cart_action_container" /> </div> </form> - -<?php /* Temp MAGETWO-36023 markup */?> -<div class="cart-gift-item"> - <?php echo $block->getChildHtml('checkout.cart.order.actions') ?> -</div> - -<?php /* End Temp MAGETWO-36023 markup */?> - +<?php echo $block->getChildHtml('checkout.cart.order.actions') ?> <?php echo $block->getChildHtml('shopping.cart.table.after'); ?> -- GitLab From bb2db1d98dc49dffa6ef406d996bce129826638d Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 14:57:16 +0300 Subject: [PATCH 049/396] MAGETWO-38155: Create block for order level --- .../Magento/GiftMessage/Block/Options.php | 91 +++++++++++++++++++ .../Test/Unit/Block/OptionsTest.php.phtml | 68 ++++++++++++++ .../frontend/layout/checkout_cart_index.xml | 14 +++ 3 files changed, 173 insertions(+) create mode 100644 app/code/Magento/GiftMessage/Block/Options.php create mode 100644 app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php.phtml create mode 100644 app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml diff --git a/app/code/Magento/GiftMessage/Block/Options.php b/app/code/Magento/GiftMessage/Block/Options.php new file mode 100644 index 00000000000..443f9e8da5d --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Options.php @@ -0,0 +1,91 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Block; + +use \Magento\Backend\Block\Template\Context; +use \Magento\Framework\Data\Form\FormKey; +use \Magento\Checkout\Model\CompositeConfigProvider; + +class Options extends \Magento\Backend\Block\Template +{ + /** + * @var \Magento\Framework\Data\Form\FormKey + */ + protected $formKey; + + /** + * @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; + + /** + * @param Context $context + * @param FormKey $formKey + * @param CompositeConfigProvider $configProvider + * @param array $layoutProcessors + * @param array $data + */ + public function __construct( + Context $context, + FormKey $formKey, + CompositeConfigProvider $configProvider, + array $layoutProcessors = [], + array $data = [] + ) { + parent::__construct($context, $data); + $this->formKey = $formKey; + $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 \Zend_Json::encode($this->jsLayout); + } + + /** + * Retrieve form key + * + * @return string + */ + public function getFormKey() + { + return $this->formKey->getFormKey(); + } + + /** + * Retrieve checkout configuration + * + * @return array + */ + public function getCheckoutConfigJson() + { + return \Zend_Json::encode($this->configProvider->getConfig()); + } +} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php.phtml b/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php.phtml new file mode 100644 index 00000000000..220b3605874 --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php.phtml @@ -0,0 +1,68 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Block; + +use Magento\GiftMessage\Block\Options; + +class OptionsTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ + protected $context; + + /** @var \Magento\Framework\Data\Form\FormKey|\PHPUnit_Framework_MockObject_MockObject */ + protected $formKey; + + /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ + protected $compositeConfigProvider; + + /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ + protected $layoutProcessor; + + /** @var \Magento\GiftMessage\Block\Options */ + protected $object; + + public function setUp() + { + $this->context = $this->getMock('Magento\Backend\Block\Template\Context', [], [], '', false); + $this->formKey = $this->getMock('Magento\Framework\Data\Form\FormKey', [], [], '', false); + $this->compositeConfigProvider = $this->getMock( + 'Magento\Checkout\Model\CompositeConfigProvider', + [], + [], + '', + false + ); + $this->layoutProcessor = $this->getMockForAbstractClass( + 'Magento\Checkout\Block\Checkout\LayoutProcessorInterface', + [], + '', + false + ); + $this->object = new Options( + $this->context, + $this->formKey, + $this->compositeConfigProvider, + [$this->layoutProcessor], + ['jsLayout' => []] + ); + } + + public function testGetJsLayout() + { + $this->layoutProcessor->expects($this->once()) + ->method('process') + ->willReturn([]); + $this->assertEquals('[]', $this->object->getJsLayout()); + } + + public function testGetCheckoutConfigJson() + { + $this->compositeConfigProvider->expects($this->once()) + ->method('getConfig') + ->willReturn([]); + $this->assertEquals('[]', $this->object->getCheckoutConfigJson()); + } +} 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 00000000000..6dae7509ed6 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -0,0 +1,14 @@ +<?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\Options" name="checkout.cart.additional.gift.options" template="cart/options.phtml" cacheable="false"/> + </referenceBlock> + </body> +</page> -- GitLab From a8950d9b0babdc36f959ec0277197a9a04ca6a1e Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 15:49:37 +0300 Subject: [PATCH 050/396] MAGETWO-38155: Create block for order level --- .../Magento/GiftMessage/Block/Options.php | 36 +++++++------------ ...{OptionsTest.php.phtml => OptionsTest.php} | 22 +++++++----- .../frontend/layout/checkout_cart_index.xml | 2 +- .../frontend/templates/cart/options.phtml | 19 ++++++++++ 4 files changed, 47 insertions(+), 32 deletions(-) rename app/code/Magento/GiftMessage/Test/Unit/Block/{OptionsTest.php.phtml => OptionsTest.php} (74%) create mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/cart/options.phtml diff --git a/app/code/Magento/GiftMessage/Block/Options.php b/app/code/Magento/GiftMessage/Block/Options.php index 443f9e8da5d..8af3f53668d 100644 --- a/app/code/Magento/GiftMessage/Block/Options.php +++ b/app/code/Magento/GiftMessage/Block/Options.php @@ -6,16 +6,11 @@ namespace Magento\GiftMessage\Block; use \Magento\Backend\Block\Template\Context; -use \Magento\Framework\Data\Form\FormKey; +use \Magento\Framework\Json\Encoder; use \Magento\Checkout\Model\CompositeConfigProvider; class Options extends \Magento\Backend\Block\Template { - /** - * @var \Magento\Framework\Data\Form\FormKey - */ - protected $formKey; - /** * @var bool */ @@ -36,22 +31,27 @@ class Options extends \Magento\Backend\Block\Template */ protected $layoutProcessors; + /** + * @var Encoder + */ + protected $jsonEncoder; + /** * @param Context $context - * @param FormKey $formKey + * @param Encoder $jsonEncoder * @param CompositeConfigProvider $configProvider * @param array $layoutProcessors * @param array $data */ public function __construct( Context $context, - FormKey $formKey, + Encoder $jsonEncoder, CompositeConfigProvider $configProvider, array $layoutProcessors = [], array $data = [] ) { parent::__construct($context, $data); - $this->formKey = $formKey; + $this->jsonEncoder = $jsonEncoder; $this->_isScopePrivate = true; $this->jsLayout = isset($data['jsLayout']) && is_array($data['jsLayout']) ? $data['jsLayout'] : []; $this->configProvider = $configProvider; @@ -66,26 +66,16 @@ class Options extends \Magento\Backend\Block\Template foreach ($this->layoutProcessors as $processor) { $this->jsLayout = $processor->process($this->jsLayout); } - return \Zend_Json::encode($this->jsLayout); - } - - /** - * Retrieve form key - * - * @return string - */ - public function getFormKey() - { - return $this->formKey->getFormKey(); + return $this->jsonEncoder->encode($this->jsLayout); } /** - * Retrieve checkout configuration + * Retrieve gift options configuration * * @return array */ - public function getCheckoutConfigJson() + public function getOptionsConfigJson() { - return \Zend_Json::encode($this->configProvider->getConfig()); + return $this->jsonEncoder->encode($this->configProvider->getConfig()); } } diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php.phtml b/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php similarity index 74% rename from app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php.phtml rename to app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php index 220b3605874..172c27eba99 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php.phtml +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php @@ -12,9 +12,6 @@ class OptionsTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ protected $context; - /** @var \Magento\Framework\Data\Form\FormKey|\PHPUnit_Framework_MockObject_MockObject */ - protected $formKey; - /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ protected $compositeConfigProvider; @@ -24,10 +21,13 @@ class OptionsTest extends \PHPUnit_Framework_TestCase /** @var \Magento\GiftMessage\Block\Options */ protected $object; + /** @var \Magento\Framework\Json\Encoder|\PHPUnit_Framework_MockObject_MockObject */ + protected $jsonEncoder; + public function setUp() { $this->context = $this->getMock('Magento\Backend\Block\Template\Context', [], [], '', false); - $this->formKey = $this->getMock('Magento\Framework\Data\Form\FormKey', [], [], '', false); + $this->jsonEncoder = $this->getMock('Magento\Framework\Json\Encoder', [], [], '', false); $this->compositeConfigProvider = $this->getMock( 'Magento\Checkout\Model\CompositeConfigProvider', [], @@ -43,7 +43,7 @@ class OptionsTest extends \PHPUnit_Framework_TestCase ); $this->object = new Options( $this->context, - $this->formKey, + $this->jsonEncoder, $this->compositeConfigProvider, [$this->layoutProcessor], ['jsLayout' => []] @@ -55,14 +55,20 @@ class OptionsTest extends \PHPUnit_Framework_TestCase $this->layoutProcessor->expects($this->once()) ->method('process') ->willReturn([]); - $this->assertEquals('[]', $this->object->getJsLayout()); + $this->jsonEncoder->expects($this->once()) + ->method('encode') + ->willReturn('[]'); + $this->object->getJsLayout(); } - public function testGetCheckoutConfigJson() + public function testGetOptionsConfigJson() { $this->compositeConfigProvider->expects($this->once()) ->method('getConfig') ->willReturn([]); - $this->assertEquals('[]', $this->object->getCheckoutConfigJson()); + $this->jsonEncoder->expects($this->once()) + ->method('encode') + ->willReturn('[]'); + $this->object->getOptionsConfigJson(); } } 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 index 6dae7509ed6..9192f5249d8 100644 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -8,7 +8,7 @@ <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\Options" name="checkout.cart.additional.gift.options" template="cart/options.phtml" cacheable="false"/> + <block class="Magento\GiftMessage\Block\Options" name="checkout.cart.order.actions.gift_message" template="cart/options.phtml" cacheable="false"/> </referenceBlock> </body> </page> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/cart/options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/cart/options.phtml new file mode 100644 index 00000000000..a93517bdf11 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/cart/options.phtml @@ -0,0 +1,19 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +?> +<div id="checkout-cart-options" data-bind="scope:'checkoutCartOptions'"> + <!-- ko template: getTemplate() --><!-- /ko --> + <script type="text/x-magento-init"> + { + "#checkout-cart-options": { + "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> + } + } + </script> + <script> + window.cartOptionsConfig = <?php echo $block->getOptionsConfigJson(); ?>; + </script> +</div> -- GitLab From 783903a20d7aea5f246883c7d970d20b0bf63924 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 16:39:20 +0300 Subject: [PATCH 051/396] MAGETWO-38155: Create block for order level --- .../Block/{Options.php => GiftMessage.php} | 6 +++--- .../Block/{OptionsTest.php => GiftMessageTest.php} | 12 ++++++------ .../view/frontend/layout/checkout_cart_index.xml | 2 +- .../{cart/options.phtml => gift-message.phtml} | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) rename app/code/Magento/GiftMessage/Block/{Options.php => GiftMessage.php} (92%) rename app/code/Magento/GiftMessage/Test/Unit/Block/{OptionsTest.php => GiftMessageTest.php} (87%) rename app/code/Magento/GiftMessage/view/frontend/templates/{cart/options.phtml => gift-message.phtml} (64%) diff --git a/app/code/Magento/GiftMessage/Block/Options.php b/app/code/Magento/GiftMessage/Block/GiftMessage.php similarity index 92% rename from app/code/Magento/GiftMessage/Block/Options.php rename to app/code/Magento/GiftMessage/Block/GiftMessage.php index 8af3f53668d..2ba621a027d 100644 --- a/app/code/Magento/GiftMessage/Block/Options.php +++ b/app/code/Magento/GiftMessage/Block/GiftMessage.php @@ -9,7 +9,7 @@ use \Magento\Backend\Block\Template\Context; use \Magento\Framework\Json\Encoder; use \Magento\Checkout\Model\CompositeConfigProvider; -class Options extends \Magento\Backend\Block\Template +class GiftMessage extends \Magento\Backend\Block\Template { /** * @var bool @@ -70,11 +70,11 @@ class Options extends \Magento\Backend\Block\Template } /** - * Retrieve gift options configuration + * Retrieve gift message configuration * * @return array */ - public function getOptionsConfigJson() + public function getGiftMessageConfigJson() { return $this->jsonEncoder->encode($this->configProvider->getConfig()); } diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/GiftMessageTest.php similarity index 87% rename from app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php rename to app/code/Magento/GiftMessage/Test/Unit/Block/GiftMessageTest.php index 172c27eba99..5cc608fa83c 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Block/OptionsTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/GiftMessageTest.php @@ -5,9 +5,9 @@ */ namespace Magento\GiftMessage\Test\Unit\Block; -use Magento\GiftMessage\Block\Options; +use Magento\GiftMessage\Block\GiftMessage; -class OptionsTest extends \PHPUnit_Framework_TestCase +class GiftMessageTest extends \PHPUnit_Framework_TestCase { /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ protected $context; @@ -18,7 +18,7 @@ class OptionsTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ protected $layoutProcessor; - /** @var \Magento\GiftMessage\Block\Options */ + /** @var \Magento\GiftMessage\Block\GiftMessage */ protected $object; /** @var \Magento\Framework\Json\Encoder|\PHPUnit_Framework_MockObject_MockObject */ @@ -41,7 +41,7 @@ class OptionsTest extends \PHPUnit_Framework_TestCase '', false ); - $this->object = new Options( + $this->object = new GiftMessage( $this->context, $this->jsonEncoder, $this->compositeConfigProvider, @@ -61,7 +61,7 @@ class OptionsTest extends \PHPUnit_Framework_TestCase $this->object->getJsLayout(); } - public function testGetOptionsConfigJson() + public function testGetGiftMessageConfigJson() { $this->compositeConfigProvider->expects($this->once()) ->method('getConfig') @@ -69,6 +69,6 @@ class OptionsTest extends \PHPUnit_Framework_TestCase $this->jsonEncoder->expects($this->once()) ->method('encode') ->willReturn('[]'); - $this->object->getOptionsConfigJson(); + $this->object->getGiftMessageConfigJson(); } } 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 index 9192f5249d8..68cdd197e69 100644 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -8,7 +8,7 @@ <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\Options" name="checkout.cart.order.actions.gift_message" template="cart/options.phtml" cacheable="false"/> + <block class="Magento\GiftMessage\Block\GiftMessage" name="checkout.cart.order.actions.gift_message" template="gift-message.phtml" cacheable="false"/> </referenceBlock> </body> </page> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/cart/options.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/gift-message.phtml similarity index 64% rename from app/code/Magento/GiftMessage/view/frontend/templates/cart/options.phtml rename to app/code/Magento/GiftMessage/view/frontend/templates/gift-message.phtml index a93517bdf11..e31eb7727e6 100644 --- a/app/code/Magento/GiftMessage/view/frontend/templates/cart/options.phtml +++ b/app/code/Magento/GiftMessage/view/frontend/templates/gift-message.phtml @@ -4,16 +4,16 @@ * See COPYING.txt for license details. */ ?> -<div id="checkout-cart-options" data-bind="scope:'checkoutCartOptions'"> +<div id="gift-message" data-bind="scope:'giftMessage'"> <!-- ko template: getTemplate() --><!-- /ko --> <script type="text/x-magento-init"> { - "#checkout-cart-options": { + "#gift-message": { "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> } } </script> <script> - window.cartOptionsConfig = <?php echo $block->getOptionsConfigJson(); ?>; + window.giftMessageConfig = <?php echo $block->getGiftMessageConfigJson(); ?>; </script> </div> -- GitLab From 238bb6c6c648fe27449cc5852214816cfff57e0a Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Thu, 4 Jun 2015 16:56:40 +0300 Subject: [PATCH 052/396] MAGETWO-38081: [UI] Assistance with applying new style for Gift Wrapping and Gift Messages --- .../templates/cart/item/default.phtml | 67 +++++++++---------- .../web/css/source/_module.less | 21 ++++++ 2 files changed, 54 insertions(+), 34 deletions(-) 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 947a4681864..55fb44a6f84 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 @@ -124,6 +124,38 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima class="action action-gift"> <span><?php echo __('Gift wrap'); ?></span> </a> + + <div class="gift-content"> + <div class="gift-options"> + <?php /* Gift Wrapping */ ?> + <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\new-options.phtml')); ?> + + <?php /* Gift Message */ ?> + <?php include ($block->getTemplateFile('Magento_GiftMessage::form.phtml')); ?> + </div> + + <?php /* Gift options applied */ ?> + <div class="gift-summary"> + <?php /* Applied Gift Wrapping */ ?> + <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\applied.phtml')); ?> + + <?php /* Applied Gift Message */ ?> + <?php include ($block->getTemplateFile('Magento_GiftMessage::applied.phtml')); ?> + + <div class="actions-toolbar"> + <div class="secondary"> + <button type="submit" class="action action-edit" title="Edit"> + <span><?php echo __('Edit'); ?></span> + </button> + <button class="action action-delete" title="Delete"> + <span><?php echo __('Delete'); ?></span> + </button> + </div> + </div> + </div> + <?php /* End Gift options applied */ ?> + + </div> <?php /* End Temp MAGETWO-36023 markup */?> <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllowInCart()) : ?> @@ -152,7 +184,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima </span> </a> <?php endif ?> - + <a href="#" title="<?php echo $block->escapeHtml(__('Remove item')); ?>" class="action action-delete" @@ -165,39 +197,6 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima </td> </tr> <?php /* Temp MAGETWO-36023 markup */?> - <tr class="item-gift" data-container="item-gift-container"> - <td colspan="<?php echo $cols;?>"> - <div class="gift-options"> - <?php /* Gift Wrapping */ ?> - <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\new-options.phtml')); ?> - - <?php /* Gift Message */ ?> - <?php include ($block->getTemplateFile('Magento_GiftMessage::form.phtml')); ?> - </div> - - <?php /* Gift options applied */ ?> - <div class="gift-summary"> - <?php /* Applied Gift Wrapping */ ?> - <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\applied.phtml')); ?> - - <?php /* Applied Gift Message */ ?> - <?php include ($block->getTemplateFile('Magento_GiftMessage::applied.phtml')); ?> - - <div class="actions-toolbar"> - <div class="secondary"> - <button type="submit" class="action action-edit" title="Edit"> - <span><?php echo __('Edit'); ?></span> - </button> - <button class="action action-delete" title="Delete"> - <span><?php echo __('Delete'); ?></span> - </button> - </div> - </div> - </div> - <?php /* End Gift options applied */ ?> - </td> - </tr> - <?php /* Temp js (prototyping only) */ ?> <script> require(['jquery'], function($) { 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 2f54fe103de..fb52773925b 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 @@ -62,6 +62,13 @@ } } + .cart.table-wrapper { + .gift-content { + display: none; + text-align: left; + } + } + // // Collapsible block // --------------------------------------------- @@ -229,4 +236,18 @@ &:extend(.abs-reset-left-margin-desktop all); } } + + .cart.table-wrapper { + .action-gift { + float: left; + } + .gift-content { + display: none; + clear: left; + float: left; + margin-right: -100%; + width: 100%; + } + } + } -- GitLab From 194ef26fa281412864496ac3f2489c5bd7475b5d Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Thu, 4 Jun 2015 17:09:19 +0300 Subject: [PATCH 053/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - content for several modules was changed --- .../Magento/Backend/etc/adminhtml/system.xml | 2 +- .../Controller/Adminhtml/Index/Create.php | 2 +- .../Model/Product/Option/Type/Date.php | 2 +- .../Model/Product/Option/Type/DefaultType.php | 2 +- .../Model/Product/Option/Type/File.php | 2 +- .../Option/Type/File/ValidatorFile.php | 2 +- .../Option/Type/File/ValidatorInfo.php | 2 +- .../Model/Product/Option/Type/Select.php | 4 +- .../Model/Product/Option/Type/Text.php | 2 +- .../Model/Product/Type/AbstractType.php | 2 +- .../Model/Import/Product.php | 2 +- .../frontend/templates/cart/shipping.phtml | 2 +- .../frontend/templates/onepage/billing.phtml | 2 +- .../frontend/templates/onepage/shipping.phtml | 2 +- .../frontend/web/template/authentication.html | 6 +- .../Model/Product/Type/Configurable.php | 2 +- .../Adminhtml/System/Currency/FetchRates.php | 4 +- .../Adminhtml/System/Currencysymbol/Save.php | 2 +- .../Block/Account/AuthorizationLink.php | 2 +- .../Customer/Block/Account/Dashboard.php | 2 +- .../Block/Adminhtml/Edit/Tab/View/Cart.php | 2 +- .../Adminhtml/Edit/Tab/View/Wishlist.php | 2 +- .../Sales/Order/Address/Form/Renderer/Vat.php | 6 +- .../Customer/Controller/Account/Confirm.php | 4 +- .../Controller/Account/Confirmation.php | 2 +- .../Controller/Account/CreatePost.php | 6 +- .../Customer/Controller/Account/EditPost.php | 10 +- .../Controller/Account/ForgotPasswordPost.php | 9 +- .../Customer/Controller/Account/LoginPost.php | 4 +- .../Controller/Account/ResetPasswordPost.php | 6 +- .../Customer/Controller/Address/Delete.php | 6 +- .../Customer/Controller/Address/FormPost.php | 4 +- .../Controller/Adminhtml/Group/Delete.php | 2 +- .../Controller/Adminhtml/Group/Save.php | 2 +- .../Controller/Adminhtml/Index/Edit.php | 2 +- .../Adminhtml/Index/ResetPassword.php | 4 +- .../Wishlist/Product/Composite/Wishlist.php | 2 +- .../Customer/Controller/Ajax/Login.php | 2 +- .../Customer/Model/AccountManagement.php | 14 +- .../Magento/Customer/Model/Config/Share.php | 2 +- app/code/Magento/Customer/Model/Customer.php | 16 +- .../Customer/Attribute/Backend/Password.php | 4 +- .../Customer/Model/Resource/Customer.php | 6 +- .../Magento/Customer/Model/Resource/Group.php | 2 +- .../Block/Account/AuthorizationLinkTest.php | 4 +- .../Controller/Account/CreatePostTest.php | 2 +- .../Unit/Controller/Account/EditPostTest.php | 2 +- .../Adminhtml/Index/ResetPasswordTest.php | 4 +- .../Customer/Test/Unit/Model/CustomerTest.php | 12 +- .../templates/system/config/validatevat.phtml | 4 +- .../templates/tab/view/personal_info.phtml | 2 +- .../Customer/view/email/account_new.html | 6 +- .../view/email/account_new_confirmation.html | 6 +- .../view/email/account_new_confirmed.html | 4 +- .../layout/customer_account_logoutsuccess.xml | 2 +- .../templates/account/dashboard/info.phtml | 4 +- .../frontend/templates/address/book.phtml | 2 +- .../frontend/templates/address/edit.phtml | 2 +- .../templates/form/confirmation.phtml | 4 +- .../templates/form/forgotpassword.phtml | 2 +- .../view/frontend/templates/form/login.phtml | 2 +- .../frontend/templates/form/register.phtml | 4 +- .../view/frontend/templates/logout.phtml | 2 +- .../view/frontend/templates/newcustomer.phtml | 4 +- .../Model/Import/AbstractCustomer.php | 4 +- .../Adminhtml/System/Design/Editor/Launch.php | 2 +- .../Adminhtml/System/Design/Editor/Revert.php | 6 +- .../Adminhtml/System/Design/Editor/Save.php | 2 +- .../Design/Editor/Tools/SaveImageSizing.php | 2 +- .../templates/editor/tools/code/js.phtml | 2 +- .../view/adminhtml/web/js/custom-css.js | 2 +- .../view/adminhtml/web/js/image-sizing.js | 2 +- .../adminhtml/web/js/quick-style-element.js | 2 +- .../adminhtml/web/js/quick-style-uploader.js | 2 +- .../view/adminhtml/web/js/theme-assign.js | 2 +- .../view/adminhtml/web/js/theme-save.js | 2 +- .../view/adminhtml/web/js/theme-selector.js | 2 +- .../Dhl/Block/Adminhtml/Unitofmeasure.php | 4 +- app/code/Magento/Dhl/Model/Carrier.php | 16 +- app/code/Magento/Dhl/etc/adminhtml/system.xml | 2 +- .../Model/Resource/Region/Collection.php | 2 +- .../Downloadable/Controller/Download/Link.php | 4 +- .../Unit/Controller/Download/LinkTest.php | 2 +- .../Block/Adminhtml/Template/Edit/Form.php | 2 +- .../Adminhtml/Email/Template/Delete.php | 4 +- .../Adminhtml/Email/Template/Save.php | 2 +- app/code/Magento/Email/Model/Template.php | 2 +- .../adminhtml/templates/template/edit.phtml | 6 +- app/code/Magento/Fedex/Model/Carrier.php | 8 +- .../adminhtml/templates/template/edit.phtml | 2 +- .../Model/Observer/PreventExpressCheckout.php | 2 +- .../Review/view/frontend/templates/form.phtml | 2 +- .../Adminhtml/Order/AddressSave.php | 2 +- .../Sales/Model/Resource/Order/Address.php | 2 +- .../Unit/Model/Resource/Order/AddressTest.php | 2 +- .../Tax/Controller/Adminhtml/Rate/Delete.php | 2 +- .../Controller/Adminhtml/Tax/AjaxDelete.php | 2 +- .../System/Design/Wysiwyg/Files/NewFolder.php | 2 +- .../Magento/Theme/Model/Resource/Design.php | 7 +- app/code/Magento/Ups/Model/Carrier.php | 2 +- .../Adminhtml/Auth/Forgotpassword.php | 2 +- .../Adminhtml/Auth/ResetPasswordPost.php | 2 +- app/code/Magento/Usps/Model/Carrier.php | 2 +- .../Customer/Api/AccountManagementTest.php | 4 +- .../Product/AbstractCompareProductsTest.php | 4 +- ...AssertCurrencySymbolSuccessSaveMessage.php | 2 +- .../AssertAddressDeletedFrontend.php | 2 +- .../AssertChangePasswordFailMessage.php | 2 +- ...ssertCustomerAddressSuccessSaveMessage.php | 2 +- ...ssertCustomerGroupSuccessDeleteMessage.php | 2 +- .../AssertCustomerGroupSuccessSaveMessage.php | 2 +- .../AssertCustomerInfoSuccessSavedMessage.php | 2 +- .../CreateExistingCustomerFrontendEntity.php | 2 +- .../RegisterCustomerFrontendEntityTest.php | 2 +- .../TestStep/LoginCustomerOnFrontendStep.php | 2 +- .../TestStep/LogoutCustomerOnFrontendStep.php | 2 +- .../Option/Type/File/ValidatorFileTest.php | 2 +- .../Option/Type/File/ValidatorInfoTest.php | 2 +- .../Model/Product/Type/AbstractTypeTest.php | 4 +- .../System/Currency/FetchRatesTest.php | 4 +- .../Adminhtml/Edit/Tab/View/CartTest.php | 2 +- .../Customer/Controller/AccountTest.php | 14 +- .../Customer/Controller/AddressTest.php | 6 +- .../Controller/Adminhtml/GroupTest.php | 4 +- .../Controller/Adminhtml/IndexTest.php | 4 +- .../Customer/Model/AccountManagementTest.php | 2 +- .../Magento/Email/Model/TemplateTest.php | 2 +- dev/tests/performance/benchmark.jmx | 2 +- lib/web/css/docs/forms.html | 221 +++++++++--------- lib/web/css/docs/source/forms.less | 2 +- 130 files changed, 334 insertions(+), 327 deletions(-) diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml index 614c5a50789..7cb4eadb7db 100644 --- a/app/code/Magento/Backend/etc/adminhtml/system.xml +++ b/app/code/Magento/Backend/etc/adminhtml/system.xml @@ -406,7 +406,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"> diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php index dc57f5fe5d0..35112845bcb 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php @@ -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/Catalog/Model/Product/Option/Type/Date.php b/app/code/Magento/Catalog/Model/Product/Option/Type/Date.php index e34493d5095..b29a82e6d0e 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 430f1ff7acb..e001dced13f 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); 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 21a1ecedb1f..04faaeb1225 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/ValidatorFile.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php index 9f8c3c955c9..930892b55ca 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 @@ -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 373b8a63db3..0e0acad062e 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 4214b8031f0..c3c49e06779 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 e0c80e3d34b..99c17e0a3af 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 b40b91d5b08..837e2481681 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/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index d3bdc5557d7..5a502d722f3 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -113,7 +113,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ValidatorInterface::ERROR_INVALID_ATTR_SET => 'Invalid value for Product Template column (set does not exists?)', 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', 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 7585ca9388f..71964e6df44 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> 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 951f7355804..d2468e2aeda 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 6848faef6f2..335269fe4a1 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/web/template/authentication.html b/app/code/Magento/Checkout/view/frontend/web/template/authentication.html index b9739ff9bc3..441aeab4715 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/authentication.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/authentication.html @@ -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/ConfigurableProduct/Model/Product/Type/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php index 867ad33a9ab..804611ddf76 100644 --- a/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php +++ b/app/code/Magento/ConfigurableProduct/Model/Product/Type/Configurable.php @@ -791,7 +791,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(); } /** 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 f6463d67084..693673995c9 100644 --- a/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php +++ b/app/code/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRates.php @@ -38,10 +38,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 01940a5bee4..ebe76676650 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 $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.')); $this->getResponse()->setRedirect($this->_redirect->getRedirectUrl($this->getUrl('*'))); } diff --git a/app/code/Magento/Customer/Block/Account/AuthorizationLink.php b/app/code/Magento/Customer/Block/Account/AuthorizationLink.php index 395e884137e..a9bf5043c96 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 a21e707a0db..6c01684645e 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/View/Cart.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Cart.php index be1da04628e..b2adb0316d2 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/Wishlist.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Wishlist.php index 1c8bb379696..de0c973ddd1 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 wishlist 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 7d1ec32fa36..14bb0596ffd 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 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 04e84dd7cee..765c548d701 100644 --- a/app/code/Magento/Customer/Controller/Account/Confirm.php +++ b/app/code/Magento/Customer/Controller/Account/Confirm.php @@ -132,14 +132,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 3d9121e414e..0151d9e6b1e 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 988beb09148..e8815cbe722 100644 --- a/app/code/Magento/Customer/Controller/Account/CreatePost.php +++ b/app/code/Magento/Customer/Controller/Account/CreatePost.php @@ -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 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/EditPost.php b/app/code/Magento/Customer/Controller/Account/EditPost.php index c61860f6400..cd3923725c2 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 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 fc391f41435..bcef0600876 100644 --- a/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php +++ b/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php @@ -67,18 +67,13 @@ 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.', $email)); // @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 500a2f7b683..1025a1e801a 100644 --- a/app/code/Magento/Customer/Controller/Account/LoginPost.php +++ b/app/code/Magento/Customer/Controller/Account/LoginPost.php @@ -99,10 +99,10 @@ 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 validating the login and password.')); } } else { - $this->messageManager->addError(__('Login and password are required.')); + $this->messageManager->addError(__('A login and password are required.')); } } diff --git a/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php b/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php index 2d53034cb68..f76e619001f 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 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 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 6c334448779..dad54304cff 100644 --- a/app/code/Magento/Customer/Controller/Address/Delete.php +++ b/app/code/Magento/Customer/Controller/Address/Delete.php @@ -20,12 +20,12 @@ 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(__('An error occurred while deleting the address.')); + $this->messageManager->addError(__('Something went wrong while deleting the address.')); } } catch (\Exception $other) { - $this->messageManager->addException($other, __('An error occurred while deleting the address.')); + $this->messageManager->addException($other, __('Something went wrong while deleting the address.')); } } return $this->resultRedirectFactory->create()->setPath('*/*/index'); diff --git a/app/code/Magento/Customer/Controller/Address/FormPost.php b/app/code/Magento/Customer/Controller/Address/FormPost.php index 86af07c5293..1cb96534130 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 60cbfe172b0..17af771114f 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 614abdb1c68..a842d8653b3 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 cc024c50701..7a0fa4df782 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 bd74b364b82..c330eedde0f 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/Wishlist/Product/Composite/Wishlist.php b/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist.php index 6829fa73a0d..0a3b0a58be5 100644 --- a/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist.php +++ b/app/code/Magento/Customer/Controller/Adminhtml/Wishlist/Product/Composite/Wishlist.php @@ -36,7 +36,7 @@ class Wishlist extends \Magento\Backend\App\Action { $wishlistItemId = (int)$this->getRequest()->getParam('id'); if (!$wishlistItemId) { - throw new CoreException(__('No wishlist item ID is defined.')); + throw new CoreException(__('No wish list item ID is defined.')); } /* @var $wishlistItem \Magento\Wishlist\Model\Item */ diff --git a/app/code/Magento/Customer/Controller/Ajax/Login.php b/app/code/Magento/Customer/Controller/Ajax/Login.php index ef8cf2cef15..0313e4456a9 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 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 75ca7bdf731..7cfcf9f9035 100644 --- a/app/code/Magento/Customer/Model/AccountManagement.php +++ b/app/code/Magento/Customer/Model/AccountManagement.php @@ -494,7 +494,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 +514,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 +620,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 +650,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 +806,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 33d1047ce52..f20ade76d9e 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 776c8e74e1a..6e64ec2fc08 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) { @@ -1010,11 +1012,11 @@ class Customer extends \Magento\Framework\Model\AbstractModel { $errors = []; if (!\Zend_Validate::is(trim($this->getFirstname()), 'NotEmpty')) { - $errors[] = __('The first name cannot be empty.'); + $errors[] = __('Please enter a first name.'); } if (!\Zend_Validate::is(trim($this->getLastname()), 'NotEmpty')) { - $errors[] = __('The last name cannot be empty.'); + $errors[] = __('Please enter a last name.'); } if (!\Zend_Validate::is($this->getEmail(), 'EmailAddress')) { @@ -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 value.'); } $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 23ebcb64d01..992c63cf893 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 57da7ca88c5..682e429411b 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 49b79e0fe77..6dc9888d771 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 55580fc8bcf..3d74163212f 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/CreatePostTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/CreatePostTest.php index 41115e5ac86..c765dc83939 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 eabe54ae5d4..60cf3b1348f 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 336877afcab..a4a9df750dc 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 5f91793ec70..ca722c837c1 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php @@ -164,23 +164,23 @@ class CustomerTest extends \PHPUnit_Framework_TestCase 'gender' => 'm', ]; return [ - [array_diff_key($data, ['firstname' => '']), ['The first name cannot be empty.']], - [array_diff_key($data, ['lastname' => '']), ['The last name cannot be empty.']], + [array_diff_key($data, ['firstname' => '']), ['Please enter a first name.']], + [array_diff_key($data, ['lastname' => '']), ['Please enter a last name.']], [array_diff_key($data, ['email' => '']), ['Please correct this email address: "".']], [ 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 value.']], [$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/view/adminhtml/templates/system/config/validatevat.phtml b/app/code/Magento/Customer/view/adminhtml/templates/system/config/validatevat.phtml index 56f09823bb3..5fc873ad749 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 90d849d33f5..eb035963983 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 a979c99c42e..d49f91c3b27 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 e-mail 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/> + Use the following values when prompted to sign in:<br/> <strong>E-mail</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 8e36cd4940e..9eb2f61ebe4 100644 --- a/app/code/Magento/Customer/view/email/account_new_confirmation.html +++ b/app/code/Magento/Customer/view/email/account_new_confirmation.html @@ -36,10 +36,10 @@ 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 e-mail {{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 e-mail 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/> + Use the following values when prompted to sign in:<br/> <strong>E-mail:</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. 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 14d5a488015..6d726f9e74c 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;">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 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 9d94c7ef08d..adebacc5bac 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/templates/account/dashboard/info.phtml b/app/code/Magento/Customer/view/frontend/templates/account/dashboard/info.phtml index af711971ec3..6659f62b175 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 ca5b016ee62..1f1a472fb72 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 e3af1854aa5..75736960880 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 72d35663bd4..24a8a5382d6 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 b190e036eb7..fcb9d44aff8 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 6d15f8936ed..3c8137c84e7 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 934a7481cb6..37d3d2291b2 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> diff --git a/app/code/Magento/Customer/view/frontend/templates/logout.phtml b/app/code/Magento/Customer/view/frontend/templates/logout.phtml index c6e9fb05d3f..24335090a2b 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 e4609e91131..23167146ba6 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/Import/AbstractCustomer.php b/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php index 1795e575450..eeeff7057ca 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php @@ -106,11 +106,11 @@ 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_WEBSITE_IS_EMPTY, __('Please specify a website.')); $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_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") 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 661a25f4cd1..2a19e481791 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, there was an unknown error.')); + $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 d2b47b28159..6da421c7035 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 bc03a26180f..92c4f1427f9 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, there was an unknown error.')]; + $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/SaveImageSizing.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveImageSizing.php index 42e971eb4ef..d26a89802e0 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/view/adminhtml/templates/editor/tools/code/js.phtml b/app/code/Magento/DesignEditor/view/adminhtml/templates/editor/tools/code/js.phtml index 8958f030185..f0f38865ea2 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, there was an unknown error.')); + 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 35e5b14497d..0c9a267b626 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, there was an unknown error.')); + 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 200fdc42b67..02012572e2e 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, there was an unknown error.')); + 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 b60d34cc137..5894637bb0d 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, there was an unknown error.')); + 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 b14f9c05dfb..65c87581364 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, there was an unknown error.')); + 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 05da6050e25..15b31ef6e6c 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, there was an unknown error.'); + 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 616225fb4f3..3ae094d3262 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 f59b2506563..be314eaf9f0 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, there was an unknown error.')); + 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 24d343f61c5..2118fb588a6 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 dc2388e4e0c..3943551de3f 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 89f4d3f7631..c9a14fecf5d 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/Model/Resource/Region/Collection.php b/app/code/Magento/Directory/Model/Resource/Region/Collection.php index c41af5db808..37d67636b7d 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/Downloadable/Controller/Download/Link.php b/app/code/Magento/Downloadable/Controller/Download/Link.php index 0c0cd1bbe85..28a5f0bc586 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/Test/Unit/Controller/Download/LinkTest.php b/app/code/Magento/Downloadable/Test/Unit/Controller/Download/LinkTest.php index 0efd1ada35e..da584a79ca4 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/Email/Block/Adminhtml/Template/Edit/Form.php b/app/code/Magento/Email/Block/Adminhtml/Template/Edit/Form.php index cc10d6112dd..c05c1e44ad1 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 0f2c544f9ac..5b7d03fb3cd 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/*/'); @@ -37,7 +37,7 @@ class Delete extends \Magento\Email\Controller\Adminhtml\Email\Template $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addError( - __('An error occurred while deleting email template data. Please review log and try again.') + __('Something went wrong while deleting email template data. Please review the log and try again.') ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); // save data in session 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 29285d07707..5ccf9120253 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/Template.php b/app/code/Magento/Email/Model/Template.php index 577393b4989..8b9e01d79eb 100644 --- a/app/code/Magento/Email/Model/Template.php +++ b/app/code/Magento/Email/Model/Template.php @@ -603,7 +603,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/view/adminhtml/templates/template/edit.phtml b/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml index 2d9e527653d..9c2fa323140 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. Check the error log for details.') ?>'); } }.bind(this) }); diff --git a/app/code/Magento/Fedex/Model/Carrier.php b/app/code/Magento/Fedex/Model/Carrier.php index 66f266dd1a8..db802c1912e 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/Newsletter/view/adminhtml/templates/template/edit.phtml b/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml index 1f7fad5b100..f208f4c4f22 100644 --- a/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml +++ b/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml @@ -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/Persistent/Model/Observer/PreventExpressCheckout.php b/app/code/Magento/Persistent/Model/Observer/PreventExpressCheckout.php index 6b2614c23a2..e6f0f3a7a74 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/Review/view/frontend/templates/form.phtml b/app/code/Magento/Review/view/frontend/templates/form.phtml index 958cbe2e1de..3f22eca8136 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">register</a>', $block->getLoginLink(), $block->getRegisterUrl()) ?> </div> </div> <?php endif ?> diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php index 6e0b2251ced..fc174f97b8b 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php @@ -28,7 +28,7 @@ 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 { diff --git a/app/code/Magento/Sales/Model/Resource/Order/Address.php b/app/code/Magento/Sales/Model/Resource/Order/Address.php index b11ffd3c458..c7d56a6b3a3 100644 --- a/app/code/Magento/Sales/Model/Resource/Order/Address.php +++ b/app/code/Magento/Sales/Model/Resource/Order/Address.php @@ -108,7 +108,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/Model/Resource/Order/AddressTest.php b/app/code/Magento/Sales/Test/Unit/Model/Resource/Order/AddressTest.php index 92b3222098a..85d167520a3 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/Tax/Controller/Adminhtml/Rate/Delete.php b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Delete.php index 9ee9be000e8..154d9eef01d 100755 --- a/app/code/Magento/Tax/Controller/Adminhtml/Rate/Delete.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Rate/Delete.php @@ -28,7 +28,7 @@ class Delete extends \Magento\Tax\Controller\Adminhtml\Rate return $resultRedirect->setPath("*/*/"); } catch (NoSuchEntityException $e) { $this->messageManager->addError( - __('Something went wrong deleting this rate because of an incorrect rate ID.') + __('We can\'t delete this rate because of an incorrect rate ID.') ); return $resultRedirect->setPath("tax/*/"); } diff --git a/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php b/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php index 20e413ed5e7..8e5e003872d 100644 --- a/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php +++ b/app/code/Magento/Tax/Controller/Adminhtml/Tax/AjaxDelete.php @@ -26,7 +26,7 @@ class AjaxDelete extends \Magento\Tax\Controller\Adminhtml\Tax } catch (\Exception $e) { $responseContent = [ 'success' => false, - 'error_message' => __('Something went wrong deleting this tax class.') + 'error_message' => __('We can\'t delete this tax class right now.') ]; } /** @var \Magento\Framework\Controller\Result\Json $resultJson */ 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 dc97c136728..018e8194f37 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, there was an unknown error.')]; + $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 85a393429f1..64d52783d40 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/Ups/Model/Carrier.php b/app/code/Magento/Ups/Model/Carrier.php index 3085a8b35c9..fca7588c0ae 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/User/Controller/Adminhtml/Auth/Forgotpassword.php b/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php index 046b494fdb9..ee7a4c1ad3d 100644 --- a/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php +++ b/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php @@ -44,7 +44,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.', + 'We\'ll email you a link to reset your password.', $this->_objectManager->get('Magento\Framework\Escaper')->escapeHtml($email) ) ); diff --git a/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php b/app/code/Magento/User/Controller/Adminhtml/Auth/ResetPasswordPost.php index 834e5e19b01..bae69c2415f 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 2d7845696c8..2aa0517e787 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/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php index e1cbe53152c..d77ab4ee6de 100644 --- a/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Customer/Api/AccountManagementTest.php @@ -535,8 +535,8 @@ class AccountManagementTest extends WebapiAbstract $requestData = ['customer' => $customerData]; $validationResponse = $this->_webApiCall($serviceInfo, $requestData); $this->assertFalse($validationResponse['valid']); - $this->assertEquals('The first name cannot be empty.', $validationResponse['messages'][0]); - $this->assertEquals('The last name cannot be empty.', $validationResponse['messages'][1]); + $this->assertEquals('Please enter a first name.', $validationResponse['messages'][0]); + $this->assertEquals('Please enter a last name.', $validationResponse['messages'][1]); } public function testIsReadonly() 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 94ab4152c7b..ed44c17d572 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/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Constraint/AssertCurrencySymbolSuccessSaveMessage.php index cba4716edd8..912106f71bb 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 26fe078ecac..8568c75053e 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 c641ad37997..48c58b1c316 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 ab7ac43f795..9dbf30c353e 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 8e90ae7bcaa..81b3fc72b63 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 a7cc0fca78d..9069acfce81 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 6f9d6d9c144..6396afca4ba 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 80e7a2eef28..ca15d911626 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 @@ -91,7 +91,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($customer); } 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 c28cfc03061..9e327387a2a 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 3cd67136fbb..b3b0ff013ca 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 21a17180e7e..15bc85e2c06 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. 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 4999c68d059..3a89eed1a97 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() 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 157b01ec429..f47edeb86bc 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 @@ -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 2dabe7eec0e..ac18747bda8 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/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php index 6b2f926e8ad..823a2adf5a5 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 @@ -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/Customer/Block/Adminhtml/Edit/Tab/View/CartTest.php b/dev/tests/integration/testsuite/Magento/Customer/Block/Adminhtml/Edit/Tab/View/CartTest.php index 6ec5ae6f465..da93f3cdd96 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 6e0482828b1..f729db5a50d 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -281,7 +281,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 ); } @@ -356,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 saving the new password.']), MessageInterface::TYPE_ERROR ); } @@ -378,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 ); } @@ -444,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 ); @@ -485,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 ); @@ -543,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 ); } @@ -571,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 acf4ba7ebf5..33bd014ffd2 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 ); } @@ -174,7 +174,7 @@ class AddressTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/address/index')); $this->assertSessionMessages( - $this->equalTo(['An error occurred while deleting the address.']), + $this->equalTo(['Something went wrong while deleting the address.']), \Magento\Framework\Message\MessageInterface::TYPE_ERROR ); } 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 93739deb389..3ae1f6ed77c 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/GroupTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/GroupTest.php @@ -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 a52fef8b40a..cb2f6be9907 100755 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php @@ -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 2fe6befd9c3..343285af8d7 100755 --- a/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php @@ -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/Email/Model/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php index 70d92a6e3a0..bc462312b6b 100755 --- a/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php +++ b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php @@ -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/performance/benchmark.jmx b/dev/tests/performance/benchmark.jmx index 77934c61897..6fda461b91e 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/lib/web/css/docs/forms.html b/lib/web/css/docs/forms.html index 03c301a17af..a7fccf9d9d9 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/source/forms.less b/lib/web/css/docs/source/forms.less index f3fd20c0c88..ec9a19e5ce0 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> -- GitLab From e39d12c00b6a972eee958a26e6408ae7bfe7660e Mon Sep 17 00:00:00 2001 From: Yaroslav Onischenko <yonischenko@ebay.com> Date: Thu, 4 Jun 2015 17:58:24 +0300 Subject: [PATCH 054/396] MAGETWO-37729: Stock is not updated when Stock indexer is in Update on Schedule mode --- .../Model/Resource/Stock/Item.php | 1 + app/code/Magento/Indexer/etc/crontab.xml | 2 +- .../CatalogInventory/Model/Stock/ItemTest.php | 42 +++++++++++++++++-- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php b/app/code/Magento/CatalogInventory/Model/Resource/Stock/Item.php index b182d738370..ee653da7358 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/Indexer/etc/crontab.xml b/app/code/Magento/Indexer/etc/crontab.xml index 33e6a27040f..2dd222c0e01 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/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php index 6acd799855c..6f1de7273cd 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,46 @@ 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()); + } + + /** + * @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()); -- GitLab From d41ca3f015c6bfeb1dc51a5bb8e60b9475a9d6be Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 18:24:21 +0300 Subject: [PATCH 055/396] MAGETWO-38155: Create block for order level --- .../Block/{GiftMessage.php => Cart/GiftOptions.php} | 6 +++--- .../GiftOptionsTest.php} | 12 ++++++------ .../view/frontend/layout/checkout_cart_index.xml | 2 +- .../{gift-message.phtml => Cart/gift-options.phtml} | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) rename app/code/Magento/GiftMessage/Block/{GiftMessage.php => Cart/GiftOptions.php} (92%) rename app/code/Magento/GiftMessage/Test/Unit/Block/{GiftMessageTest.php => Cart/GiftOptionsTest.php} (87%) rename app/code/Magento/GiftMessage/view/frontend/templates/{gift-message.phtml => Cart/gift-options.phtml} (67%) diff --git a/app/code/Magento/GiftMessage/Block/GiftMessage.php b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php similarity index 92% rename from app/code/Magento/GiftMessage/Block/GiftMessage.php rename to app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php index 2ba621a027d..78641a6468b 100644 --- a/app/code/Magento/GiftMessage/Block/GiftMessage.php +++ b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php @@ -3,13 +3,13 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\GiftMessage\Block; +namespace Magento\GiftMessage\Block\Cart; use \Magento\Backend\Block\Template\Context; use \Magento\Framework\Json\Encoder; use \Magento\Checkout\Model\CompositeConfigProvider; -class GiftMessage extends \Magento\Backend\Block\Template +class GiftOptions extends \Magento\Backend\Block\Template { /** * @var bool @@ -74,7 +74,7 @@ class GiftMessage extends \Magento\Backend\Block\Template * * @return array */ - public function getGiftMessageConfigJson() + public function getGiftOptionsConfigJson() { return $this->jsonEncoder->encode($this->configProvider->getConfig()); } diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/GiftMessageTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php similarity index 87% rename from app/code/Magento/GiftMessage/Test/Unit/Block/GiftMessageTest.php rename to app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php index 5cc608fa83c..926e68e7431 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Block/GiftMessageTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php @@ -3,11 +3,11 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\GiftMessage\Test\Unit\Block; +namespace Magento\GiftMessage\Test\Unit\Block\Cart; -use Magento\GiftMessage\Block\GiftMessage; +use Magento\GiftMessage\Block\Cart\GiftOptions; -class GiftMessageTest extends \PHPUnit_Framework_TestCase +class GiftOptionsTest extends \PHPUnit_Framework_TestCase { /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ protected $context; @@ -18,7 +18,7 @@ class GiftMessageTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ protected $layoutProcessor; - /** @var \Magento\GiftMessage\Block\GiftMessage */ + /** @var \Magento\GiftMessage\Block\Cart\GiftOptions */ protected $object; /** @var \Magento\Framework\Json\Encoder|\PHPUnit_Framework_MockObject_MockObject */ @@ -41,7 +41,7 @@ class GiftMessageTest extends \PHPUnit_Framework_TestCase '', false ); - $this->object = new GiftMessage( + $this->object = new GiftOptions( $this->context, $this->jsonEncoder, $this->compositeConfigProvider, @@ -61,7 +61,7 @@ class GiftMessageTest extends \PHPUnit_Framework_TestCase $this->object->getJsLayout(); } - public function testGetGiftMessageConfigJson() + public function testGetGiftOptionsConfigJson() { $this->compositeConfigProvider->expects($this->once()) ->method('getConfig') 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 index 68cdd197e69..57d05bdb19c 100644 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -8,7 +8,7 @@ <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\GiftMessage" name="checkout.cart.order.actions.gift_message" template="gift-message.phtml" cacheable="false"/> + <block class="Magento\GiftMessage\Block\Cart\GiftOptions" name="checkout.cart.order.actions.gift_options" template="cart/gift-options.phtml" cacheable="false"/> </referenceBlock> </body> </page> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/gift-message.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift-options.phtml similarity index 67% rename from app/code/Magento/GiftMessage/view/frontend/templates/gift-message.phtml rename to app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift-options.phtml index e31eb7727e6..5c99c2b9f6f 100644 --- a/app/code/Magento/GiftMessage/view/frontend/templates/gift-message.phtml +++ b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift-options.phtml @@ -4,16 +4,16 @@ * See COPYING.txt for license details. */ ?> -<div id="gift-message" data-bind="scope:'giftMessage'"> +<div id="gift-options" data-bind="scope:'giftOptions'"> <!-- ko template: getTemplate() --><!-- /ko --> <script type="text/x-magento-init"> { - "#gift-message": { + "#gift-options": { "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> } } </script> <script> - window.giftMessageConfig = <?php echo $block->getGiftMessageConfigJson(); ?>; + window.giftOptionsConfig = <?php echo $block->getGiftOptionsConfigJson(); ?>; </script> </div> -- GitLab From 6d89d68ac3ae6b3cbf10c24ad5853dd1c7d9b64e Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 18:25:16 +0300 Subject: [PATCH 056/396] MAGETWO-38155: Create block for order level --- .../view/frontend/templates/Cart/gift-options.phtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 5c99c2b9f6f..af4d469a652 100644 --- a/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift-options.phtml +++ b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift-options.phtml @@ -4,11 +4,11 @@ * See COPYING.txt for license details. */ ?> -<div id="gift-options" data-bind="scope:'giftOptions'"> +<div id="gift-options-cart" data-bind="scope:'giftOptionsCart'"> <!-- ko template: getTemplate() --><!-- /ko --> <script type="text/x-magento-init"> { - "#gift-options": { + "#gift-options-cart": { "Magento_Ui/js/core/app": <?php echo $block->getJsLayout();?> } } -- GitLab From 9b617a6fc8ee2a64fa308fb52d3a5b4b0210f239 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 18:33:32 +0300 Subject: [PATCH 057/396] MAGETWO-38155: Create block for order level --- .../GiftMessage/view/frontend/layout/checkout_cart_index.xml | 2 +- .../templates/Cart/{gift-options.phtml => gift_options.phtml} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename app/code/Magento/GiftMessage/view/frontend/templates/Cart/{gift-options.phtml => gift_options.phtml} (100%) 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 index 57d05bdb19c..2edb9c90e9b 100644 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -8,7 +8,7 @@ <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"/> + <block class="Magento\GiftMessage\Block\Cart\GiftOptions" name="checkout.cart.order.actions.gift_options" template="gift_options.phtml" cacheable="false"/> </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 similarity index 100% rename from app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift-options.phtml rename to app/code/Magento/GiftMessage/view/frontend/templates/Cart/gift_options.phtml -- GitLab From 8978f8e051a086286b56b14dbc0a9dbf2dd008d0 Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Thu, 4 Jun 2015 18:35:16 +0300 Subject: [PATCH 058/396] MAGETWO-38139: Implement extensible point in cart item action --- .../Block/Checkout/Cart/Item/Renderer.php | 5 +- .../layout/checkout_cart_item_renderers.xml | 7 +- .../layout/checkout_cart_item_renderers.xml | 7 +- .../Checkout/Block/Cart/Item/Renderer.php | 44 +++-- .../Block/Cart/Item/Renderer/Actions.php | 59 ++++++ .../Block/Cart/Item/Renderer/Actions/Edit.php | 25 +++ .../Cart/Item/Renderer/Actions/Generic.php | 47 +++++ .../Cart/Item/Renderer/Actions/Remove.php | 41 +++++ .../Block/Cart/Item/Renderer/Context.php | 34 ++++ .../Cart/Item/Renderer/Actions/EditTest.php | 90 ++++++++++ .../Item/Renderer/Actions/GenericTest.php | 82 +++++++++ .../Cart/Item/Renderer/Actions/RemoveTest.php | 69 +++++++ .../Block/Cart/Item/Renderer/ActionsTest.php | 110 ++++++++++++ .../Block/Cart/Item/Renderer/ContextTest.php | 34 ++++ .../Unit/Block/Cart/Item/RendererTest.php | 74 +++++++- .../layout/checkout_cart_item_renderers.xml | 14 +- .../templates/cart/item/default.phtml | 170 +----------------- .../cart/item/renderer/actions/edit.phtml | 19 ++ .../cart/item/renderer/actions/remove.phtml | 18 ++ .../layout/checkout_cart_item_renderers.xml | 7 +- .../Block/Checkout/Cart/Item/Renderer.php | 5 +- .../layout/checkout_cart_item_renderers.xml | 7 +- .../checkout/cart/item/default.phtml | 17 +- .../layout/checkout_cart_item_renderers.xml | 7 +- .../Item/Renderer/Actions/MoveToWishlist.php | 52 ++++++ .../Renderer/Actions/MoveToWishlistTest.php | 84 +++++++++ .../layout/checkout_cart_item_renderers.xml | 32 ++++ .../renderer/actions/move_to_wishlist.phtml | 17 ++ .../Test/Legacy/_files/obsolete_methods.php | 5 + 29 files changed, 973 insertions(+), 209 deletions(-) create mode 100644 app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php create mode 100644 app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php create mode 100644 app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php create mode 100644 app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php create mode 100644 app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php create mode 100644 app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php create mode 100644 app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php create mode 100644 app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php create mode 100644 app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php create mode 100644 app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ContextTest.php create mode 100644 app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/edit.phtml create mode 100644 app/code/Magento/Checkout/view/frontend/templates/cart/item/renderer/actions/remove.phtml create mode 100644 app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php create mode 100644 app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php create mode 100644 app/code/Magento/Wishlist/view/frontend/layout/checkout_cart_item_renderers.xml create mode 100644 app/code/Magento/Wishlist/view/frontend/templates/cart/item/renderer/actions/move_to_wishlist.phtml 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 9139bd45b3e..c107e8fe412 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,9 @@ 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 \Magento\Checkout\Block\Cart\Item\Renderer\Context $itemContext + * @param Configuration $bundleProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -44,6 +45,7 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer \Magento\Framework\Message\ManagerInterface $messageManager, PriceCurrencyInterface $priceCurrency, \Magento\Framework\Module\Manager $moduleManager, + \Magento\Checkout\Block\Cart\Item\Renderer\Context $itemContext, Configuration $bundleProductConfiguration, array $data = [] ) { @@ -57,6 +59,7 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer $messageManager, $priceCurrency, $moduleManager, + $itemContext, $data ); $this->_isScopePrivate = true; 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 9c84f673513..94ceb9f5440 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/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/Catalog/view/frontend/layout/checkout_cart_item_renderers.xml index d14cbd5b13e..8760461ac72 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/Checkout/Block/Cart/Item/Renderer.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php index 7394a876366..7781f071c21 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\Context; use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Framework\View\Element\AbstractBlock; use Magento\Quote\Model\Quote\Item; use Magento\Catalog\Pricing\Price\ConfiguredPriceInterface; @@ -84,6 +86,11 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage */ public $moduleManager; + /** + * @var Context + */ + public $itemContext; + /** * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Catalog\Helper\Product\Configuration $productConfig @@ -93,6 +100,7 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency * @param \Magento\Framework\Module\Manager $moduleManager + * @param Context $itemContext * @param array $data */ public function __construct( @@ -104,6 +112,7 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage \Magento\Framework\Message\ManagerInterface $messageManager, PriceCurrencyInterface $priceCurrency, \Magento\Framework\Module\Manager $moduleManager, + Context $itemContext, array $data = [] ) { $this->priceCurrency = $priceCurrency; @@ -115,6 +124,7 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage parent::__construct($context, $data); $this->_isScopePrivate = true; $this->moduleManager = $moduleManager; + $this->itemContext = $itemContext; } /** @@ -316,19 +326,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 +429,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() { @@ -623,4 +620,23 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage $block->setItem($item); return $block->toHtml(); } + + /** + * Get row total including tax html + * + * @param Item\AbstractItem $item + * @return string + */ + public function getActions(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + { + /** @var \Magento\Checkout\Block\Cart\Item\Renderer\Actions $block */ + $block = $this->getChildBlock('actions'); + if ($block instanceof AbstractBlock) { + $this->itemContext->setQuoteItem($item); + $block->setItemContext($this->itemContext); + 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 00000000000..7b9f7329a59 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.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; + +use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; +use Magento\Framework\View\Element\Text; + +class Actions extends Text +{ + /** + * @var Context + */ + protected $itemContext; + + /** + * Returns current quote item + * + * @return Context + */ + public function getItemContext() + { + return $this->itemContext; + } + + /** + * Set current quote item + * + * @param Context $itemContext + */ + public function setItemContext(Context $itemContext) + { + $this->itemContext = $itemContext; + } + + /** + * 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->setItemContext($this->getItemContext()); + $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 00000000000..431686b15e3 --- /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->getItemContext()->getQuoteItem()->getId(), + 'product_id' => $this->getItemContext()->getQuoteItem()->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 00000000000..5ce780b9f02 --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php @@ -0,0 +1,47 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; + +use Magento\Checkout\Block\Cart\Item\Renderer\Context; +use Magento\Framework\View\Element\Template; + +class Generic extends Template +{ + /** + * @var Context + */ + protected $itemContext; + + /** + * Returns current quote item + * + * @return Context + */ + public function getItemContext() + { + return $this->itemContext; + } + + /** + * Set current quote item + * + * @param Context $itemContext + */ + public function setItemContext(Context $itemContext) + { + $this->itemContext = $itemContext; + } + + /** + * Check if product is visible in site visibility + * + * @return bool + */ + public function isProductVisibleInSiteVisibility() + { + return $this->getItemContext()->getQuoteItem()->getProduct()->isVisibleInSiteVisibility(); + } +} 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 00000000000..83a2ff8187a --- /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->getItemContext()->getQuoteItem()); + } +} diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php new file mode 100644 index 00000000000..99a9ce63ace --- /dev/null +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php @@ -0,0 +1,34 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Checkout\Block\Cart\Item\Renderer; + +class Context +{ + /** + * @var \Magento\Quote\Model\Quote\Item\AbstractItem + */ + protected $quoteItem; + + /** + * Returns current quote item + * + * @return \Magento\Quote\Model\Quote\Item\AbstractItem + */ + public function getQuoteItem() + { + return $this->quoteItem; + } + + /** + * Set current quote item + * + * @param \Magento\Quote\Model\Quote\Item\AbstractItem $quoteItem + */ + public function setQuoteItem($quoteItem) + { + $this->quoteItem = $quoteItem; + } +} 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 00000000000..0156f500333 --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/EditTest.php @@ -0,0 +1,90 @@ +<?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\Checkout\Block\Cart\Item\Renderer\Context; +use Magento\Quote\Model\Quote\Item\AbstractItem; + +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 Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + */ + $contextMock = $this->getMockBuilder('\Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + ->disableOriginalConstructor() + ->setMethods(['getProduct', 'getId']) + ->getMockForAbstractClass(); + + /** + * @var Product|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $contextMock->expects($this->exactly(2)) + ->method('getQuoteItem') + ->willReturn($itemMock); + + $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->setItemContext($contextMock); + $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 00000000000..d7cb14642cb --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php @@ -0,0 +1,82 @@ +<?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\Checkout\Block\Cart\Item\Renderer\Context; +use Magento\Quote\Model\Quote\Item\AbstractItem; + +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 testGetItemContext() + { + /** + * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + */ + $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->model->setItemContext($contextMock); + $this->assertEquals($contextMock, $this->model->getItemContext()); + } + + public function testIsProductVisibleInSiteVisibility() + { + /** + * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + */ + $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + ->disableOriginalConstructor() + ->setMethods(['getProduct']) + ->getMockForAbstractClass(); + + /** + * @var Product|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + + $contextMock->expects($this->once()) + ->method('getQuoteItem') + ->willReturn($itemMock); + + $itemMock->expects($this->once()) + ->method('getProduct') + ->willReturn($productMock); + + $productMock->expects($this->once()) + ->method('isVisibleInSiteVisibility') + ->willReturn(true); + + $this->model->setItemContext($contextMock); + $this->assertTrue($this->model->isProductVisibleInSiteVisibility()); + } +} 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 00000000000..28a587126ea --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/Actions/RemoveTest.php @@ -0,0 +1,69 @@ +<?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\Block\Cart\Item\Renderer\Context; +use Magento\Checkout\Helper\Cart; +use Magento\Quote\Model\Quote\Item\AbstractItem; + +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 Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + */ + $contextMock = $this->getMockBuilder('\Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $contextMock->expects($this->once()) + ->method('getQuoteItem') + ->willReturn($itemMock); + + $this->cartHelperMock->expects($this->once()) + ->method('getDeletePostJson') + ->with($itemMock) + ->willReturn($json); + + $this->model->setItemContext($contextMock); + $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 00000000000..7518a908651 --- /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\Checkout\Block\Cart\Item\Renderer\Context; + +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 testGetItemContext() + { + /** + * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + */ + $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + + $this->model->setItemContext($contextMock); + $this->assertEquals($contextMock, $this->model->getItemContext()); + } + + 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 Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + */ + $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->model->setItemContext($contextMock); + + $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('setItemContext') + ->with($contextMock); + + $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/Renderer/ContextTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ContextTest.php new file mode 100644 index 00000000000..7326b3e9a7e --- /dev/null +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ContextTest.php @@ -0,0 +1,34 @@ +<?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\Context; + +class ContextTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var Context + */ + protected $model; + + protected function setUp() + { + $this->model = new Context(); + } + + public function testGetQuoteItem() + { + /** + * @var \Magento\Quote\Model\Quote\Item\AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->model->setQuoteItem($itemMock); + $this->assertEquals($itemMock, $this->model->getQuoteItem()); + } +} 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 575eebc4188..9677356b1dc 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 @@ -24,6 +24,11 @@ class RendererTest extends \PHPUnit_Framework_TestCase */ protected $layout; + /** + * @var \Magento\Checkout\Block\Cart\Item\Renderer\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $itemContextMock; + protected function setUp() { $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -38,11 +43,16 @@ class RendererTest extends \PHPUnit_Framework_TestCase ->method('getLayout') ->will($this->returnValue($this->layout)); + $this->itemContextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + $this->_renderer = $objectManagerHelper->getObject( 'Magento\Checkout\Block\Cart\Item\Renderer', [ 'imageHelper' => $this->_imageHelper, - 'context' => $context + 'context' => $context, + 'itemContext' => $this->itemContextMock, ] ); } @@ -147,4 +157,66 @@ 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 \Magento\Quote\Model\Quote\Item\AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->itemContextMock->expects($this->once()) + ->method('setQuoteItem') + ->with($itemMock); + + $blockMock->expects($this->once()) + ->method('setItemContext') + ->with($this->itemContextMock); + $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 \Magento\Quote\Model\Quote\Item\AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->itemContextMock->expects($this->never()) + ->method('setQuoteItem'); + + $this->assertEquals('', $this->_renderer->getActions($itemMock)); + } } 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 d5462c158bd..572820909c2 100644 --- a/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml +++ b/app/code/Magento/Checkout/view/frontend/layout/checkout_cart_item_renderers.xml @@ -9,8 +9,18 @@ <update handle="checkout_item_price_renderers"/> <body> <referenceBlock name="checkout.cart.item.renderers"> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml"/> - <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.default.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.default.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.default.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> + <block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.simple.actions" as="actions"> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.simple.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/> + <block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.simple.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/> + </block> + </block> </referenceBlock> </body> </page> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/default.phtml index 55fb44a6f84..e0aa120c9c6 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,176 +118,8 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <tr class="item-actions"> <td colspan="<?php echo $cols;?>"> <div class="actions-toolbar"> - - <?php /* Temp MAGETWO-36023 markup */?> - <a href="#" - class="action action-gift"> - <span><?php echo __('Gift wrap'); ?></span> - </a> - - <div class="gift-content"> - <div class="gift-options"> - <?php /* Gift Wrapping */ ?> - <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\new-options.phtml')); ?> - - <?php /* Gift Message */ ?> - <?php include ($block->getTemplateFile('Magento_GiftMessage::form.phtml')); ?> - </div> - - <?php /* Gift options applied */ ?> - <div class="gift-summary"> - <?php /* Applied Gift Wrapping */ ?> - <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\applied.phtml')); ?> - - <?php /* Applied Gift Message */ ?> - <?php include ($block->getTemplateFile('Magento_GiftMessage::applied.phtml')); ?> - - <div class="actions-toolbar"> - <div class="secondary"> - <button type="submit" class="action action-edit" title="Edit"> - <span><?php echo __('Edit'); ?></span> - </button> - <button class="action action-delete" title="Delete"> - <span><?php echo __('Delete'); ?></span> - </button> - </div> - </div> - </div> - <?php /* End Gift options applied */ ?> - - </div> - <?php /* End Temp MAGETWO-36023 markup */?> - - <?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 action-towishlist"> - <span><?php echo __('Move to Wishlist'); ?></span> - </a> - <?php endif ?> - <?php endif ?> - - <?php /* Temp MAGETWO-36023 markup */?> - <a href="#" - class="action action-giftregistry"> - <span><?php echo __('Move to Registry'); ?></span> - </a> - <?php /* End Temp MAGETWO-36023 markup */?> - - <?php if ($isVisibleProduct): ?> - <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 ?> - - <a href="#" - title="<?php echo $block->escapeHtml(__('Remove item')); ?>" - class="action 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> - <?php /* Temp MAGETWO-36023 markup */?> - <?php /* Temp js (prototyping only) */ ?> - <script> - require(['jquery'], function($) { - "use strict"; - - var giftWrappingCustom = { - options: { - activeClass: '_active', - giftOptions: '.gift-options', - giftContainer: "[data-container='item-gift-container']", - giftWrappingItem: '.gift-wrapping-item', - giftWrappingPreviewImg: '.gift-wrapping-preview img', - giftSummary: '.gift-summary', - giftWrappingSummaryPrice: '.gift-wrapping-summary .price', - giftPriceItem: '.gift-wrapping-title .price' - }, - init: function() { - if (($(this.options.giftContainer)).data('initialized') != true) { - $(this.options.giftContainer).data('initialized', true); - this.initCollapsible() - .initSlider(); - } - }, - initCollapsible: function() { - var actionGift = $('.action-gift'), - itemGift, - options = this.options; - - - actionGift.on('click', function(e) { - e.preventDefault(); - - itemGift = $(this) - .parents('.item-actions') - .siblings(options.giftContainer); - - $(this).toggleClass(options.activeClass); - itemGift.toggleClass(options.activeClass); - }); - - return this; - }, - initSlider: function() { - var mainImage, - customPrices = [ - '$1.00','$7.00','$33.00','$22.00','$12.0','$4.00' - ], - options = this.options, - listImagesItem, - current, - currentImageSrc; - - $(options.giftWrappingItem).on('click', function() { - current = $(this); - - mainImage = current - .parents(options.giftOptions) - .find(options.giftWrappingPreviewImg); - - listImagesItem = current - .parents(options.giftOptions) - .find(options.giftWrappingItem); - - listImagesItem.removeClass(options.activeClass); - current = $(this).addClass(options.activeClass); - - // Update main image src - currentImageSrc = current - .find('img') - .attr('src'); - - mainImage.attr('src', currentImageSrc); - - // Update item price - current - .parents(options.giftOptions) - .find(options.giftPriceItem) - .text(customPrices[current.index()]); - - // Update summary price - current - .parents(options.giftOptions) - .siblings(options.giftSummary) - .find(options.giftWrappingSummaryPrice) - .text(customPrices[current.index()]); - }); - return this; - } - }; - giftWrappingCustom.init(); - }); - </script> - <?php /* End Temp MAGETWO-36023 markup */?> </tbody> 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 00000000000..08c6f2ca40e --- /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 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 00000000000..70d782cd1a5 --- /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 delete" + data-post='<?php echo $block->getDeletePostJson(); ?>'> + <span> + <?php echo __('Remove item')?> + </span> +</a> 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 ed335b6babc..8b303c7a667 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/Downloadable/Block/Checkout/Cart/Item/Renderer.php b/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php index 699e44fe150..9ee2a98469a 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,9 @@ 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\Checkout\Block\Cart\Item\Renderer\Context $itemContext + * @param \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ @@ -44,6 +45,7 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer \Magento\Framework\Message\ManagerInterface $messageManager, PriceCurrencyInterface $priceCurrency, \Magento\Framework\Module\Manager $moduleManager, + \Magento\Checkout\Block\Cart\Item\Renderer\Context $itemContext, \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration, array $data = [] ) { @@ -57,6 +59,7 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer $messageManager, $priceCurrency, $moduleManager, + $itemContext, $data ); } 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 7a152eff590..f6307cf7f80 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 b1b38150bd6..e45c33bba79 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 Wishlist'); ?></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/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/GroupedProduct/view/frontend/layout/checkout_cart_item_renderers.xml index c9021d6bcbd..8044a857c6a 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/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 00000000000..182b73143aa --- /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->getItemContext()->getQuoteItem()->getId()); + } +} diff --git a/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php b/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php new file mode 100644 index 00000000000..fb7a494bfc1 --- /dev/null +++ b/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php @@ -0,0 +1,84 @@ +<?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\Checkout\Block\Cart\Item\Renderer\Context; +use Magento\Quote\Model\Quote\Item\AbstractItem; +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 Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + */ + $contextMock = $this->getMockBuilder('\Magento\Checkout\Block\Cart\Item\Renderer\Context') + ->disableOriginalConstructor() + ->getMock(); + + /** + * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + */ + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + ->disableOriginalConstructor() + ->setMethods(['getId']) + ->getMockForAbstractClass(); + + $contextMock->expects($this->once()) + ->method('getQuoteItem') + ->willReturn($itemMock); + + $itemMock->expects($this->once()) + ->method('getId') + ->willReturn($itemId); + + $this->wishlistHelperMock->expects($this->once()) + ->method('getMoveFromCartParams') + ->with($itemId) + ->willReturn($json); + + $this->model->setItemContext($contextMock); + $this->assertEquals($json, $this->model->getMoveFromCartParams()); + } +} 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 00000000000..6318b605dd5 --- /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 00000000000..43ab9870788 --- /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 towishlist"> + <span><?php echo __('Move to Wishlist'); ?></span> + </a> +<?php endif ?> 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 2ed697e91c8..ff60ef6da0e 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 @@ -2232,4 +2232,9 @@ return [ ['Magento\Catalog\Model\Product\Attribute\Backend\Startdate', 'Magento\Catalog\Model\Attribute\Backend\Startdate'], ['_getStoreTimezoneUtcOffset', 'Magento\Reports\Model\Resource\Report\AbstractReport'], ['_dateToUtc', 'Magento\Reports\Model\Resource\Report\AbstractReport'], + [ + 'getConfigureUrl', + 'Magento\Checkout\Block\Cart\Item\Renderer', + '\Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit::getConfigureUrl' + ], ]; -- GitLab From 5f1f8dbc4fe96a66bf7aaa6a28a0758c259a452d Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 4 Jun 2015 18:35:49 +0300 Subject: [PATCH 059/396] MAGETWO-38155: Create block for order level --- .../GiftMessage/view/frontend/layout/checkout_cart_index.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 2edb9c90e9b..5a319b2212d 100644 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -8,7 +8,7 @@ <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="gift_options.phtml" cacheable="false"/> + <block class="Magento\GiftMessage\Block\Cart\GiftOptions" name="checkout.cart.order.actions.gift_options" template="cart/gift_options.phtml" cacheable="false"/> </referenceBlock> </body> </page> -- GitLab From 0ec5046347e40a72bedb50ad2b2db5c88a9d83a5 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Thu, 4 Jun 2015 19:32:02 +0300 Subject: [PATCH 060/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - content for several modules was changed --- .../Customer/Controller/Account/ForgotPasswordPost.php | 3 +-- app/code/Magento/GiftMessage/Setup/InstallSchema.php | 2 +- .../GiftMessage/view/frontend/templates/inline.phtml | 10 +++++----- .../frontend/web/template/item-level-gift-message.html | 2 +- .../web/template/order-level-gift-message.html | 2 +- .../Adminhtml/Order/View/Giftmessage/Save.php | 2 +- .../adminhtml/templates/order/create/giftmessage.phtml | 2 +- .../Sendfriend/view/frontend/templates/send.phtml | 4 ++-- .../User/Controller/Adminhtml/Auth/Forgotpassword.php | 7 +------ 9 files changed, 14 insertions(+), 20 deletions(-) diff --git a/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php b/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php index bcef0600876..89b3b2384be 100644 --- a/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php +++ b/app/code/Magento/Customer/Controller/Account/ForgotPasswordPost.php @@ -71,9 +71,8 @@ class ForgotPasswordPost extends \Magento\Customer\Controller\Account $resultRedirect->setPath('*/*/forgotpassword'); return $resultRedirect; } - $email = $this->escaper->escapeHtml($email); // @codingStandardsIgnoreStart - $this->messageManager->addSuccess(__('We\'ll email you 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/GiftMessage/Setup/InstallSchema.php b/app/code/Magento/GiftMessage/Setup/InstallSchema.php index 139148434cc..2c4c10593df 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/view/frontend/templates/inline.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/inline.phtml index a96a4a70a02..7e363d665d5 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/template/item-level-gift-message.html b/app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html index 68aedda15ec..83432afd48f 100644 --- 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 @@ -32,7 +32,7 @@ <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> + <p data-bind="text: $t('Leave a box blank if you don\'t want to add a gift message for that item.')"></p> <div class="field from"> <label class="label" data-bind="attr: {for: 'gift-message-' + item_id + '-from'}"><span data-bind="text: $t('From')"></span></label> <div class="control"> 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 index 3053c94ed65..fc9be980c70 100644 --- 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 @@ -10,7 +10,7 @@ <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> + <p data-bind="text: $t('Leave this box blank if you don\'t want to leave a gift message for the entire order.')"></p> <div class="field from"> <label for="gift-message-whole-from" class="label"><span data-bind="text: $t('From')"></span></label> <div class="control"> 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 7e11a848105..554935ed551 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/view/adminhtml/templates/order/create/giftmessage.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/create/giftmessage.phtml index f06c41f3340..bc1ee98518a 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/Sendfriend/view/frontend/templates/send.phtml b/app/code/Magento/Sendfriend/view/frontend/templates/send.phtml index eb8e4f7cef5..dd7e75d820f 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 __('Registrant') ?></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/User/Controller/Adminhtml/Auth/Forgotpassword.php b/app/code/Magento/User/Controller/Adminhtml/Auth/Forgotpassword.php index ee7a4c1ad3d..0c412d61ac9 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( - __( - 'We\'ll email you 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() -- GitLab From f8f6430d22415c4856a670bf515da719144194d5 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 5 Jun 2015 11:03:12 +0300 Subject: [PATCH 061/396] MAGETWO-38155: Create block for order level --- .../GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php index 926e68e7431..3bb154b7b7b 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php @@ -41,7 +41,7 @@ class GiftOptionsTest extends \PHPUnit_Framework_TestCase '', false ); - $this->object = new GiftOptions( + $this->object = new GiftOptions( $this->context, $this->jsonEncoder, $this->compositeConfigProvider, -- GitLab From 1e4b7b8f4d2b26f7ce8f5279804c9d3f8b309d24 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Fri, 5 Jun 2015 11:46:32 +0300 Subject: [PATCH 062/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - content for several modules was changed --- .../Model/System/Message/SecurityTest.php | 2 +- .../Catalog/Block/Adminhtml/Product/Grid.php | 2 +- .../Option/Type/File/ValidatorFile.php | 2 +- .../Catalog/Test/Unit/Model/CategoryTest.php | 4 +-- .../Model/Export/Product.php | 2 +- .../Unit/Controller/Account/ConfirmTest.php | 4 +-- .../Customer/view/frontend/layout/default.xml | 2 +- .../Model/Import/AbstractCustomer.php | 8 ++--- .../Model/Import/Address.php | 6 ++-- .../Model/Import/Customer.php | 12 +++++-- .../Block/Adminhtml/Items/Item.php | 2 +- .../Googleshopping/Items/MassAdd.php | 2 +- .../Googleshopping/Items/Refresh.php | 4 +-- .../Adminhtml/Googleshopping/Types/Edit.php | 2 +- .../Googleshopping/Types/LoadAttributes.php | 2 +- .../Adminhtml/Googleshopping/Types/Save.php | 2 +- .../GoogleShopping/Model/Attribute/Tax.php | 2 +- .../GoogleShopping/Model/MassOperations.php | 26 +++++++------- .../Test/Unit/Model/MassOperationsTest.php | 10 +++--- .../Magento/GoogleShopping/etc/config.xml | 2 +- .../view/adminhtml/templates/types/edit.phtml | 2 +- .../templates/types/edit/attributes.phtml | 2 +- .../Block/Adminhtml/Export/Filter.php | 4 +-- .../Controller/Adminhtml/Export/Export.php | 4 +-- .../Controller/Adminhtml/Export/GetFilter.php | 2 +- .../Controller/Adminhtml/Import/Validate.php | 25 +++++++++----- app/code/Magento/ImportExport/Helper/Data.php | 4 +-- .../Magento/ImportExport/Model/Export.php | 18 +++++----- .../Model/Export/AbstractEntity.php | 4 +-- .../Model/Export/Adapter/AbstractAdapter.php | 6 ++-- .../ImportExport/Model/Export/Adapter/Csv.php | 2 +- .../Model/Export/Entity/AbstractEntity.php | 4 +-- .../Magento/ImportExport/Model/Import.php | 34 +++++++++++-------- .../Model/Import/AbstractEntity.php | 4 +-- .../ImportExport/Model/Import/Adapter.php | 2 +- .../Model/Import/Entity/AbstractEntity.php | 4 +-- .../Customer/Controller/AccountTest.php | 3 +- .../Adminhtml/Import/ValidateTest.php | 2 +- .../Magento/Framework/File/Uploader.php | 2 +- .../Magento/Framework/Model/AbstractModel.php | 2 +- 40 files changed, 124 insertions(+), 104 deletions(-) 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 a6de88c77b5..9e1937dae50 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/Catalog/Block/Adminhtml/Product/Grid.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php index 23cce6c8cff..b393a3632ea 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Grid.php @@ -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/Model/Product/Option/Type/File/ValidatorFile.php b/app/code/Magento/Catalog/Model/Product/Option/Type/File/ValidatorFile.php index 930892b55ca..cea7f07b44c 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.') ); } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/CategoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/CategoryTest.php index ce9dca7cfef..cf4fbe668a4 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 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 find the new category you selected. + * @expectedExceptionMessage Sorry, but we can't find the new category you selected. * @codingStandardsIgnoreEnd */ public function testMoveWhenCannotFindNewCategory() diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 7b3303731f3..98eb2155349 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -348,7 +348,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/Customer/Test/Unit/Controller/Account/ConfirmTest.php b/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php index bbcbfe8192d..b240ad9298e 100644 --- a/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php +++ b/app/code/Magento/Customer/Test/Unit/Controller/Account/ConfirmTest.php @@ -318,8 +318,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/view/frontend/layout/default.xml b/app/code/Magento/Customer/view/frontend/layout/default.xml index 9e45480b4fc..fa2df7eb340 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/CustomerImportExport/Model/Import/AbstractCustomer.php b/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php index eeeff7057ca..1c20c89fe1a 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/AbstractCustomer.php @@ -107,13 +107,13 @@ abstract class AbstractCustomer extends \Magento\ImportExport\Model\Import\Entit ); $this->addMessageTemplate(self::ERROR_WEBSITE_IS_EMPTY, __('Please specify a website.')); - $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_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 72df1baa354..f95a0d47033 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 c42ed953406..5fbe559b5c0 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 mail 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/GoogleShopping/Block/Adminhtml/Items/Item.php b/app/code/Magento/GoogleShopping/Block/Adminhtml/Items/Item.php index 073826ff9eb..b8e26b0aa1c 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 4f101189769..5b06a7c58fc 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 60795768337..4219dfaa500 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. Check 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 e3f5eb02d24..ae6cbce96e7 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 0d817329dd8..ff46793c0eb 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 f8e4e7a1a7c..1456880daa1 100644 --- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Save.php +++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Types/Save.php @@ -56,7 +56,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 098171523d9..28361f4c032 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 d34fb365ed5..b7fd743a2f2 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, @@ -294,7 +294,7 @@ class MassOperations if ($totalFailed > 0 || count($errors)) { array_unshift($errors, __("We cannot update %1 items.", $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 fa6854a990f..3930a68a2b8 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()); @@ -192,7 +192,7 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addMajor') ->with( - 'Errors happened during synchronization with Google Shopping', + 'Something went wrong during synchronization with Google Shopping.', ['We cannot update 1 items.', 'The item "Product Name" hasn\'t been updated.'] )->will($this->returnSelf()); $this->massOperations->synchronizeItems([1]); @@ -218,8 +218,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]); @@ -250,7 +250,7 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addMajor') ->with( - 'Errors happened while deleting items from Google Shopping', + 'Something went wrong while deleting items from Google Shopping.', ['The item "Product Name" hasn\'t been deleted.'] )->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 82d68fde892..86a242ec143 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 f322f744c26..9b272ee3255 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 d40677511d7..f968eed629c 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/ImportExport/Block/Adminhtml/Export/Filter.php b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php index c7d648b4d54..e4a67984427 100644 --- a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php +++ b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php @@ -154,7 +154,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.'); } } @@ -237,7 +237,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 1995511a498..a223c72ccd1 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 38296ff530d..7e50e5fca30 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 64e267e253b..041f040c677 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 any 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 any 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 any 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 @@ -80,7 +86,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.')); } else { if (!$validationResult) { $this->processValidationError($import, $resultBlock); @@ -91,7 +97,7 @@ 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()); @@ -106,14 +112,15 @@ class Validate extends ImportController ); } } catch (\Exception $e) { - $resultBlock->addNotice(__('Please fix errors and re-upload file.'))->addError($e->getMessage()); + $resultBlock->addNotice(__('Please fix any 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 462fd7f424b..0e81094f971 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 227fd2fab3c..1e463ed13e3 100644 --- a/app/code/Magento/ImportExport/Model/Export.php +++ b/app/code/Magento/ImportExport/Model/Export.php @@ -98,7 +98,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 && @@ -106,7 +106,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' ) @@ -144,13 +144,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' ) ); @@ -175,10 +175,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 ) { return self::FILTER_TYPE_INPUT; } 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.') + ); } } @@ -266,7 +268,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 5c9932f95d3..b4c768780a2 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 a83e0cc3bf6..20a92c0f6c9 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 fe1d00d2c65..652079422b2 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 c9581ad7e74..ec0349416fb 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 54c06276c1b..a2997ee9be3 100644 --- a/app/code/Magento/ImportExport/Model/Import.php +++ b/app/code/Magento/ImportExport/Model/Import.php @@ -175,14 +175,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' ) @@ -229,17 +231,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 any 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 any errors and re-upload the file.', $this->getErrorsLimit() ); } else { if ($this->isImportAllowed()) { - $messages[] = __('Please fix errors and re-upload file.'); + $messages[] = __('Please fix any 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 @@ -249,9 +251,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(); @@ -266,7 +268,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; } @@ -430,7 +432,7 @@ class Import extends \Magento\ImportExport\Model\AbstractModel $this->getInvalidRowsCount(), $this->getErrorsCount() ), - __('Import has been done successfuly.'), + __('The import was successful.'), ] ); @@ -462,7 +464,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); } @@ -477,7 +479,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; @@ -495,7 +497,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); @@ -540,7 +542,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; } @@ -595,7 +597,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 5a21fd560d5..5402815ea20 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; } @@ -718,7 +718,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 d6211b013ef..d551378ba64 100644 --- a/app/code/Magento/ImportExport/Model/Import/Adapter.php +++ b/app/code/Magento/ImportExport/Model/Import/Adapter.php @@ -27,7 +27,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 e690fb3e076..431535b2591 100644 --- a/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php +++ b/app/code/Magento/ImportExport/Model/Import/Entity/AbstractEntity.php @@ -544,7 +544,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; } @@ -704,7 +704,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/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index f729db5a50d..821a9b763b1 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -318,8 +318,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 ); 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 cc698e42cfe..3c922f0fd7d 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 @@ -60,7 +60,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/lib/internal/Magento/Framework/File/Uploader.php b/lib/internal/Magento/Framework/File/Uploader.php index cfc862a635b..b5a0dedbbdf 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/Model/AbstractModel.php b/lib/internal/Magento/Framework/Model/AbstractModel.php index fcd03252a41..a686950cb8d 100644 --- a/lib/internal/Magento/Framework/Model/AbstractModel.php +++ b/lib/internal/Magento/Framework/Model/AbstractModel.php @@ -243,7 +243,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 is not set.') ); } -- GitLab From 75a1a76ce335b511bcc512ea34ec9c8f827c584a Mon Sep 17 00:00:00 2001 From: Maksym Iakusha <miakusha@ebay.com> Date: Fri, 5 Jun 2015 11:49:29 +0300 Subject: [PATCH 063/396] MAGETWO-38011: [Nord] Unit test Coverage - Sprint 22 --- .../Magento/Email/Model/AbstractTemplate.php | 4 +- app/code/Magento/Newsletter/Model/Queue.php | 13 +- .../Newsletter/Test/Unit/Model/QueueTest.php | 205 ++++++++++++++++++ 3 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 app/code/Magento/Newsletter/Test/Unit/Model/QueueTest.php diff --git a/app/code/Magento/Email/Model/AbstractTemplate.php b/app/code/Magento/Email/Model/AbstractTemplate.php index 4eba984b8fc..7eda17bd421 100644 --- a/app/code/Magento/Email/Model/AbstractTemplate.php +++ b/app/code/Magento/Email/Model/AbstractTemplate.php @@ -79,6 +79,8 @@ abstract class AbstractTemplate extends AbstractModel implements TemplateTypesIn \Magento\Framework\Registry $registry, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Store\Model\StoreManagerInterface $storeManager, + \Magento\Framework\Model\Resource\AbstractResource $resource = null, + \Magento\Framework\Data\Collection\Db $resourceCollection = null, array $data = [] ) { $this->_design = $design; @@ -86,7 +88,7 @@ abstract class AbstractTemplate extends AbstractModel implements TemplateTypesIn $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/Newsletter/Model/Queue.php b/app/code/Magento/Newsletter/Model/Queue.php index 4c34f3419f1..db9308ce4a2 100644 --- a/app/code/Magento/Newsletter/Model/Queue.php +++ b/app/code/Magento/Newsletter/Model/Queue.php @@ -134,9 +134,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\Db $resourceCollection = null, array $data = [] ) { - parent::__construct($context, $design, $registry, $appEmulation, $storeManager, $data); + parent::__construct( + $context, + $design, + $registry, + $appEmulation, + $storeManager, + $resource, + $resourceCollection, + $data + ); $this->_templateFilter = $templateFilter; $this->_date = $date; $this->_templateFactory = $templateFactory; 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 00000000000..bb8ec3b719f --- /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()); + } +} -- GitLab From 57bf1e82d764beca453bb7bf139bff9d064ac12c Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Fri, 5 Jun 2015 12:17:45 +0300 Subject: [PATCH 064/396] MAGETWO-38167: CatalogRule Refactoring --- .../Model/Indexer/IndexBuilder.php | 26 ++- .../CatalogRule/Setup/InstallSchema.php | 16 -- .../Unit/Model/Indexer/IndexBuilderTest.php | 209 ++++++++++++++++++ .../_files/dependency_test/tables_ce.php | 1 - .../factory_table_names/replace_ce.php | 1 - 5 files changed, 231 insertions(+), 22 deletions(-) create mode 100644 app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php diff --git a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php index 55b77da9849..683f63b3201 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,12 @@ 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')); + $write->query($query); return $this; @@ -658,7 +677,6 @@ class IndexBuilder $arrData[$key]['latest_start_date'] = $this->dateFormat->formatDate($data['latest_start_date'], false); $arrData[$key]['earliest_end_date'] = $this->dateFormat->formatDate($data['earliest_end_date'], false); } - $adapter->insertOnDuplicate($this->getTable('catalogrule_affected_product'), array_unique($productIds)); $adapter->insertOnDuplicate($this->getTable('catalogrule_product_price'), $arrData); } catch (\Exception $e) { throw $e; diff --git a/app/code/Magento/CatalogRule/Setup/InstallSchema.php b/app/code/Magento/CatalogRule/Setup/InstallSchema.php index 610434b70a4..fbb411fdc30 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/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php new file mode 100644 index 00000000000..9d995731614 --- /dev/null +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php @@ -0,0 +1,209 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\CatalogRule\Test\Unit\Model\Indexer; + +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', [], [], '', 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/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 1ae037a2b47..ffd2dd8bb77 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/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php b/dev/tools/Magento/Tools/Migration/factory_table_names/replace_ce.php index b154d0183f2..f8889d4f2cb 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', -- GitLab From 8060802b45555a38848493229419d01734debb92 Mon Sep 17 00:00:00 2001 From: Maksym Iakusha <miakusha@ebay.com> Date: Fri, 5 Jun 2015 12:21:20 +0300 Subject: [PATCH 065/396] MAGETWO-37983: Improve test code coverage --- .../CatalogInventory/Test/Unit/Model/Stock/ItemTest.php | 3 +-- .../Test/Unit/Model/Stock/StockRepositoryTest.php | 3 --- .../Test/Unit/Model/Stock/StockStatusRepositoryTest.php | 3 --- 3 files changed, 1 insertion(+), 8 deletions(-) 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 c01d5f129ff..93f078e9ca1 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/ItemTest.php @@ -406,12 +406,11 @@ class ItemTest extends \PHPUnit_Framework_TestCase /** * @param array $config - * @param float $expected + * @param mixed $expected * @dataProvider getQtyIncrementsDataProvider( */ public function testGetQtyIncrements($config, $expected) { - // $qtyIncrements = 5; $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']); diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php index 517db20a884..da0623ed643 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php @@ -47,7 +47,6 @@ class StockRepositoryTest extends \PHPUnit_Framework_TestCase */ protected $mapperMock; - protected function setUp() { @@ -76,7 +75,6 @@ class StockRepositoryTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $this->model = new StockRepository( $this->stockResourceMock, $this->stockFactoryMock, @@ -182,5 +180,4 @@ class StockRepositoryTest extends \PHPUnit_Framework_TestCase $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 index e9cdd7dc23c..13fb764edcd 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php @@ -49,11 +49,9 @@ class StockStatusRepositoryTest extends \PHPUnit_Framework_TestCase 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(); @@ -67,7 +65,6 @@ class StockStatusRepositoryTest extends \PHPUnit_Framework_TestCase ) ->disableOriginalConstructor() ->getMock(); - $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') ->disableOriginalConstructor() ->getMock(); -- GitLab From 8be13ae1747508d16ca53e9198233f155282cfbb Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Fri, 5 Jun 2015 12:51:14 +0300 Subject: [PATCH 066/396] MAGETWO-38139: Implement extensible point in cart item action --- .../Block/Checkout/Cart/Item/Renderer.php | 3 -- .../Checkout/Block/Cart/Item/Renderer.php | 53 ++++++++----------- .../Block/Cart/Item/Renderer/Actions.php | 19 +++---- .../Block/Cart/Item/Renderer/Actions/Edit.php | 4 +- .../Cart/Item/Renderer/Actions/Generic.php | 30 +++++++---- .../Cart/Item/Renderer/Actions/Remove.php | 2 +- .../Block/Cart/Item/Renderer/Context.php | 34 ------------ .../Cart/Item/Renderer/Actions/EditTest.php | 21 ++------ .../Item/Renderer/Actions/GenericTest.php | 49 +++++++++-------- .../Cart/Item/Renderer/Actions/RemoveTest.php | 20 ++----- .../Block/Cart/Item/Renderer/ActionsTest.php | 22 ++++---- .../Block/Cart/Item/Renderer/ContextTest.php | 34 ------------ .../Unit/Block/Cart/Item/RendererTest.php | 38 ++++--------- .../Block/Checkout/Cart/Item/Renderer.php | 3 -- .../Item/Renderer/Actions/MoveToWishlist.php | 2 +- .../Renderer/Actions/MoveToWishlistTest.php | 21 ++------ 16 files changed, 117 insertions(+), 238 deletions(-) delete mode 100644 app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php delete mode 100644 app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ContextTest.php 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 c107e8fe412..5a23f62b959 100644 --- a/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php +++ b/app/code/Magento/Bundle/Block/Checkout/Cart/Item/Renderer.php @@ -31,7 +31,6 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\Checkout\Block\Cart\Item\Renderer\Context $itemContext * @param Configuration $bundleProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) @@ -45,7 +44,6 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer \Magento\Framework\Message\ManagerInterface $messageManager, PriceCurrencyInterface $priceCurrency, \Magento\Framework\Module\Manager $moduleManager, - \Magento\Checkout\Block\Cart\Item\Renderer\Context $itemContext, Configuration $bundleProductConfiguration, array $data = [] ) { @@ -59,7 +57,6 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer $messageManager, $priceCurrency, $moduleManager, - $itemContext, $data ); $this->_isScopePrivate = true; diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php index 7781f071c21..0775d1866a4 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer.php @@ -8,7 +8,7 @@ namespace Magento\Checkout\Block\Cart\Item; -use Magento\Checkout\Block\Cart\Item\Renderer\Context; +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; @@ -86,11 +86,6 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage */ public $moduleManager; - /** - * @var Context - */ - public $itemContext; - /** * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Catalog\Helper\Product\Configuration $productConfig @@ -100,7 +95,6 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency * @param \Magento\Framework\Module\Manager $moduleManager - * @param Context $itemContext * @param array $data */ public function __construct( @@ -112,7 +106,6 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage \Magento\Framework\Message\ManagerInterface $messageManager, PriceCurrencyInterface $priceCurrency, \Magento\Framework\Module\Manager $moduleManager, - Context $itemContext, array $data = [] ) { $this->priceCurrency = $priceCurrency; @@ -124,16 +117,15 @@ class Renderer extends \Magento\Framework\View\Element\Template implements \Mage parent::__construct($context, $data); $this->_isScopePrivate = true; $this->moduleManager = $moduleManager; - $this->itemContext = $itemContext; } /** * 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; @@ -526,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'); @@ -540,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'); @@ -554,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'); @@ -568,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'); @@ -582,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'); @@ -596,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'); @@ -610,10 +602,10 @@ 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'); @@ -624,16 +616,15 @@ 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 getActions(\Magento\Quote\Model\Quote\Item\AbstractItem $item) + public function getActions(Item $item) { - /** @var \Magento\Checkout\Block\Cart\Item\Renderer\Actions $block */ + /** @var Actions $block */ $block = $this->getChildBlock('actions'); - if ($block instanceof AbstractBlock) { - $this->itemContext->setQuoteItem($item); - $block->setItemContext($this->itemContext); + 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 index 7b9f7329a59..ddd4d72ad20 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php @@ -7,32 +7,33 @@ 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 Context + * @var Item */ - protected $itemContext; + protected $item; /** * Returns current quote item * - * @return Context + * @return Item */ - public function getItemContext() + public function getItem() { - return $this->itemContext; + return $this->item; } /** * Set current quote item * - * @param Context $itemContext + * @param Item $item */ - public function setItemContext(Context $itemContext) + public function setItem(Item $item) { - $this->itemContext = $itemContext; + $this->item = $item; } /** @@ -49,7 +50,7 @@ class Actions extends Text /** @var Generic $childBlock */ $childBlock = $layout->getBlock($child); if ($childBlock instanceof Generic) { - $childBlock->setItemContext($this->getItemContext()); + $childBlock->setItem($this->getItem()); $this->addText($layout->renderElement($child, false)); } } 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 index 431686b15e3..39cd103a9ee 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Edit.php @@ -17,8 +17,8 @@ class Edit extends Generic return $this->getUrl( 'checkout/cart/configure', [ - 'id' => $this->getItemContext()->getQuoteItem()->getId(), - 'product_id' => $this->getItemContext()->getQuoteItem()->getProduct()->getId() + '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 index 5ce780b9f02..556971a99af 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php @@ -5,34 +5,34 @@ */ namespace Magento\Checkout\Block\Cart\Item\Renderer\Actions; -use Magento\Checkout\Block\Cart\Item\Renderer\Context; use Magento\Framework\View\Element\Template; +use Magento\Quote\Model\Quote\Item; class Generic extends Template { /** - * @var Context + * @var Item */ - protected $itemContext; + protected $item; /** * Returns current quote item * - * @return Context + * @return Item */ - public function getItemContext() + public function getItem() { - return $this->itemContext; + return $this->item; } /** * Set current quote item * - * @param Context $itemContext + * @param Item $item */ - public function setItemContext(Context $itemContext) + public function setItem(Item $item) { - $this->itemContext = $itemContext; + $this->item = $item; } /** @@ -42,6 +42,16 @@ class Generic extends Template */ public function isProductVisibleInSiteVisibility() { - return $this->getItemContext()->getQuoteItem()->getProduct()->isVisibleInSiteVisibility(); + 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 index 83a2ff8187a..066afb6a082 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Remove.php @@ -36,6 +36,6 @@ class Remove extends Generic */ public function getDeletePostJson() { - return $this->cartHelper->getDeletePostJson($this->getItemContext()->getQuoteItem()); + return $this->cartHelper->getDeletePostJson($this->getItem()); } } diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php deleted file mode 100644 index 99a9ce63ace..00000000000 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Context.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Checkout\Block\Cart\Item\Renderer; - -class Context -{ - /** - * @var \Magento\Quote\Model\Quote\Item\AbstractItem - */ - protected $quoteItem; - - /** - * Returns current quote item - * - * @return \Magento\Quote\Model\Quote\Item\AbstractItem - */ - public function getQuoteItem() - { - return $this->quoteItem; - } - - /** - * Set current quote item - * - * @param \Magento\Quote\Model\Quote\Item\AbstractItem $quoteItem - */ - public function setQuoteItem($quoteItem) - { - $this->quoteItem = $quoteItem; - } -} 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 index 0156f500333..122e8c85909 100644 --- 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 @@ -7,8 +7,7 @@ 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\Checkout\Block\Cart\Item\Renderer\Context; -use Magento\Quote\Model\Quote\Item\AbstractItem; +use Magento\Quote\Model\Quote\Item; class EditTest extends \PHPUnit_Framework_TestCase { @@ -43,20 +42,12 @@ class EditTest extends \PHPUnit_Framework_TestCase $configureUrl = 'configure url'; /** - * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $contextMock = $this->getMockBuilder('\Magento\Checkout\Block\Cart\Item\Renderer\Context') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() ->getMock(); - /** - * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock - */ - $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') - ->disableOriginalConstructor() - ->setMethods(['getProduct', 'getId']) - ->getMockForAbstractClass(); - /** * @var Product|\PHPUnit_Framework_MockObject_MockObject $itemMock */ @@ -64,10 +55,6 @@ class EditTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $contextMock->expects($this->exactly(2)) - ->method('getQuoteItem') - ->willReturn($itemMock); - $itemMock->expects($this->once()) ->method('getProduct') ->willReturn($productMock); @@ -84,7 +71,7 @@ class EditTest extends \PHPUnit_Framework_TestCase ->with('checkout/cart/configure', ['id' => $itemId, 'product_id' => $productId]) ->willReturn($configureUrl); - $this->model->setItemContext($contextMock); + $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 index d7cb14642cb..3f229e7cc88 100644 --- 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 @@ -7,8 +7,7 @@ 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\Checkout\Block\Cart\Item\Renderer\Context; -use Magento\Quote\Model\Quote\Item\AbstractItem; +use Magento\Quote\Model\Quote\Item; class GenericTest extends \PHPUnit_Framework_TestCase { @@ -27,36 +26,28 @@ class GenericTest extends \PHPUnit_Framework_TestCase ); } - public function testGetItemContext() + public function testGetItem() { /** - * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() ->getMock(); - $this->model->setItemContext($contextMock); - $this->assertEquals($contextMock, $this->model->getItemContext()); + $this->model->setItem($itemMock); + $this->assertEquals($itemMock, $this->model->getItem()); } public function testIsProductVisibleInSiteVisibility() { /** - * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() ->getMock(); - /** - * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock - */ - $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') - ->disableOriginalConstructor() - ->setMethods(['getProduct']) - ->getMockForAbstractClass(); - /** * @var Product|\PHPUnit_Framework_MockObject_MockObject $itemMock */ @@ -64,10 +55,6 @@ class GenericTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $contextMock->expects($this->once()) - ->method('getQuoteItem') - ->willReturn($itemMock); - $itemMock->expects($this->once()) ->method('getProduct') ->willReturn($productMock); @@ -76,7 +63,25 @@ class GenericTest extends \PHPUnit_Framework_TestCase ->method('isVisibleInSiteVisibility') ->willReturn(true); - $this->model->setItemContext($contextMock); + $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->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 index 28a587126ea..d2ebb0637ea 100644 --- 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 @@ -6,9 +6,8 @@ namespace Magento\Checkout\Test\Unit\Block\Cart\Item\Renderer\Actions; use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove; -use Magento\Checkout\Block\Cart\Item\Renderer\Context; use Magento\Checkout\Helper\Cart; -use Magento\Quote\Model\Quote\Item\AbstractItem; +use Magento\Quote\Model\Quote\Item; class RemoveTest extends \PHPUnit_Framework_TestCase { @@ -41,29 +40,18 @@ class RemoveTest extends \PHPUnit_Framework_TestCase $json = '{json;}'; /** - * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $contextMock = $this->getMockBuilder('\Magento\Checkout\Block\Cart\Item\Renderer\Context') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() ->getMock(); - /** - * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock - */ - $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $contextMock->expects($this->once()) - ->method('getQuoteItem') - ->willReturn($itemMock); - $this->cartHelperMock->expects($this->once()) ->method('getDeletePostJson') ->with($itemMock) ->willReturn($json); - $this->model->setItemContext($contextMock); + $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 index 7518a908651..1c4c49a1f5b 100644 --- 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 @@ -7,7 +7,7 @@ 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\Checkout\Block\Cart\Item\Renderer\Context; +use Magento\Quote\Model\Quote\Item; class ActionsTest extends \PHPUnit_Framework_TestCase { @@ -45,17 +45,17 @@ class ActionsTest extends \PHPUnit_Framework_TestCase ); } - public function testGetItemContext() + public function testGetItem() { /** - * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() ->getMock(); - $this->model->setItemContext($contextMock); - $this->assertEquals($contextMock, $this->model->getItemContext()); + $this->model->setItem($itemMock); + $this->assertEquals($itemMock, $this->model->getItem()); } public function testToHtml() @@ -70,12 +70,12 @@ class ActionsTest extends \PHPUnit_Framework_TestCase ->willReturn(false); /** - * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $contextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() ->getMock(); - $this->model->setItemContext($contextMock); + $this->model->setItem($itemMock); $this->layoutMock->expects($this->once()) ->method('getChildNames') @@ -87,8 +87,8 @@ class ActionsTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); $childMockOne->expects($this->once()) - ->method('setItemContext') - ->with($contextMock); + ->method('setItem') + ->with($itemMock); $childMockTwo = false; diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ContextTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ContextTest.php deleted file mode 100644 index 7326b3e9a7e..00000000000 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ContextTest.php +++ /dev/null @@ -1,34 +0,0 @@ -<?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\Context; - -class ContextTest extends \PHPUnit_Framework_TestCase -{ - /** - * @var Context - */ - protected $model; - - protected function setUp() - { - $this->model = new Context(); - } - - public function testGetQuoteItem() - { - /** - * @var \Magento\Quote\Model\Quote\Item\AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock - */ - $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $this->model->setQuoteItem($itemMock); - $this->assertEquals($itemMock, $this->model->getQuoteItem()); - } -} 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 9677356b1dc..0796e0f6363 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 { @@ -24,11 +25,6 @@ class RendererTest extends \PHPUnit_Framework_TestCase */ protected $layout; - /** - * @var \Magento\Checkout\Block\Cart\Item\Renderer\Context|\PHPUnit_Framework_MockObject_MockObject - */ - protected $itemContextMock; - protected function setUp() { $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); @@ -43,16 +39,11 @@ class RendererTest extends \PHPUnit_Framework_TestCase ->method('getLayout') ->will($this->returnValue($this->layout)); - $this->itemContextMock = $this->getMockBuilder('Magento\Checkout\Block\Cart\Item\Renderer\Context') - ->disableOriginalConstructor() - ->getMock(); - $this->_renderer = $objectManagerHelper->getObject( 'Magento\Checkout\Block\Cart\Item\Renderer', [ 'imageHelper' => $this->_imageHelper, 'context' => $context, - 'itemContext' => $this->itemContextMock, ] ); } @@ -99,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)); @@ -180,19 +171,15 @@ class RendererTest extends \PHPUnit_Framework_TestCase ->willReturn($blockMock); /** - * @var \Magento\Quote\Model\Quote\Item\AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $this->itemContextMock->expects($this->once()) - ->method('setQuoteItem') - ->with($itemMock); + ->getMock(); $blockMock->expects($this->once()) - ->method('setItemContext') - ->with($this->itemContextMock); + ->method('setItem') + ->with($itemMock); $blockMock->expects($this->once()) ->method('toHtml') ->willReturn($blockHtml); @@ -208,14 +195,11 @@ class RendererTest extends \PHPUnit_Framework_TestCase ->willReturn(false); /** - * @var \Magento\Quote\Model\Quote\Item\AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $this->itemContextMock->expects($this->never()) - ->method('setQuoteItem'); + ->getMock(); $this->assertEquals('', $this->_renderer->getActions($itemMock)); } 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 9ee2a98469a..2416dc5d4c9 100644 --- a/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php +++ b/app/code/Magento/Downloadable/Block/Checkout/Cart/Item/Renderer.php @@ -31,7 +31,6 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param PriceCurrencyInterface $priceCurrency * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\Checkout\Block\Cart\Item\Renderer\Context $itemContext * @param \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) @@ -45,7 +44,6 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer \Magento\Framework\Message\ManagerInterface $messageManager, PriceCurrencyInterface $priceCurrency, \Magento\Framework\Module\Manager $moduleManager, - \Magento\Checkout\Block\Cart\Item\Renderer\Context $itemContext, \Magento\Downloadable\Helper\Catalog\Product\Configuration $downloadableProductConfiguration, array $data = [] ) { @@ -59,7 +57,6 @@ class Renderer extends \Magento\Checkout\Block\Cart\Item\Renderer $messageManager, $priceCurrency, $moduleManager, - $itemContext, $data ); } 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 index 182b73143aa..790280fe2d7 100644 --- a/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php +++ b/app/code/Magento/Wishlist/Block/Cart/Item/Renderer/Actions/MoveToWishlist.php @@ -47,6 +47,6 @@ class MoveToWishlist extends Generic */ public function getMoveFromCartParams() { - return $this->wishlistHelper->getMoveFromCartParams($this->getItemContext()->getQuoteItem()->getId()); + return $this->wishlistHelper->getMoveFromCartParams($this->getItem()->getId()); } } diff --git a/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php b/app/code/Magento/Wishlist/Test/Unit/Block/Cart/Item/Renderer/Actions/MoveToWishlistTest.php index fb7a494bfc1..e64e5803f09 100644 --- 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 @@ -6,8 +6,7 @@ namespace Magento\Wishlist\Test\Unit\Block\Cart\Item\Renderer\Actions; use Magento\Wishlist\Block\Cart\Item\Renderer\Actions\MoveToWishlist; -use Magento\Checkout\Block\Cart\Item\Renderer\Context; -use Magento\Quote\Model\Quote\Item\AbstractItem; +use Magento\Quote\Model\Quote\Item; use Magento\Wishlist\Helper\Data; class MoveToWishlistTest extends \PHPUnit_Framework_TestCase @@ -51,24 +50,12 @@ class MoveToWishlistTest extends \PHPUnit_Framework_TestCase $json = '{json;}'; /** - * @var Context|\PHPUnit_Framework_MockObject_MockObject $contextMock + * @var Item|\PHPUnit_Framework_MockObject_MockObject $itemMock */ - $contextMock = $this->getMockBuilder('\Magento\Checkout\Block\Cart\Item\Renderer\Context') + $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item') ->disableOriginalConstructor() ->getMock(); - /** - * @var AbstractItem|\PHPUnit_Framework_MockObject_MockObject $itemMock - */ - $itemMock = $this->getMockBuilder('Magento\Quote\Model\Quote\Item\AbstractItem') - ->disableOriginalConstructor() - ->setMethods(['getId']) - ->getMockForAbstractClass(); - - $contextMock->expects($this->once()) - ->method('getQuoteItem') - ->willReturn($itemMock); - $itemMock->expects($this->once()) ->method('getId') ->willReturn($itemId); @@ -78,7 +65,7 @@ class MoveToWishlistTest extends \PHPUnit_Framework_TestCase ->with($itemId) ->willReturn($json); - $this->model->setItemContext($contextMock); + $this->model->setItem($itemMock); $this->assertEquals($json, $this->model->getMoveFromCartParams()); } } -- GitLab From f89a9bade11bb1b2af5c21311e6ce9aa7e2190ff Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 5 Jun 2015 14:05:16 +0300 Subject: [PATCH 067/396] MAGETWO-38155: Create block for order level --- .../Test/Unit/Block/Cart/GiftOptionsTest.php | 48 +++++++++++-------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php index 3bb154b7b7b..32a94d762c7 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/GiftOptionsTest.php @@ -9,66 +9,72 @@ use Magento\GiftMessage\Block\Cart\GiftOptions; class GiftOptionsTest extends \PHPUnit_Framework_TestCase { - /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ + /** @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject */ protected $context; - /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ + /** @var \Magento\GiftMessage\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ protected $compositeConfigProvider; /** @var \Magento\Checkout\Model\CompositeConfigProvider|\PHPUnit_Framework_MockObject_MockObject */ - protected $layoutProcessor; + protected $layoutProcessorMock; /** @var \Magento\GiftMessage\Block\Cart\GiftOptions */ - protected $object; + protected $model; /** @var \Magento\Framework\Json\Encoder|\PHPUnit_Framework_MockObject_MockObject */ - protected $jsonEncoder; + protected $jsonEncoderMock; + + /** @var array */ + protected $jsLayout = ['root' => 'node']; public function setUp() { $this->context = $this->getMock('Magento\Backend\Block\Template\Context', [], [], '', false); - $this->jsonEncoder = $this->getMock('Magento\Framework\Json\Encoder', [], [], '', false); + $this->jsonEncoderMock = $this->getMock('Magento\Framework\Json\Encoder', [], [], '', false); $this->compositeConfigProvider = $this->getMock( - 'Magento\Checkout\Model\CompositeConfigProvider', + 'Magento\GiftMessage\Model\CompositeConfigProvider', [], [], '', false ); - $this->layoutProcessor = $this->getMockForAbstractClass( + $this->layoutProcessorMock = $this->getMockForAbstractClass( 'Magento\Checkout\Block\Checkout\LayoutProcessorInterface', [], '', false ); - $this->object = new GiftOptions( + $this->model = new GiftOptions( $this->context, - $this->jsonEncoder, + $this->jsonEncoderMock, $this->compositeConfigProvider, - [$this->layoutProcessor], - ['jsLayout' => []] + [$this->layoutProcessorMock], + ['jsLayout' => $this->jsLayout] ); } public function testGetJsLayout() { - $this->layoutProcessor->expects($this->once()) + $this->layoutProcessorMock->expects($this->once()) ->method('process') - ->willReturn([]); - $this->jsonEncoder->expects($this->once()) + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->jsonEncoderMock->expects($this->once()) ->method('encode') - ->willReturn('[]'); - $this->object->getJsLayout(); + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->assertEquals($this->jsLayout, $this->model->getJsLayout()); } public function testGetGiftOptionsConfigJson() { $this->compositeConfigProvider->expects($this->once()) ->method('getConfig') - ->willReturn([]); - $this->jsonEncoder->expects($this->once()) + ->willReturn($this->jsLayout); + $this->jsonEncoderMock->expects($this->once()) ->method('encode') - ->willReturn('[]'); - $this->object->getGiftMessageConfigJson(); + ->with($this->jsLayout) + ->willReturnArgument(0); + $this->assertEquals($this->jsLayout, $this->model->getGiftOptionsConfigJson()); } } -- GitLab From d54eaad7adfaf6d2df102bb3bb4232f5703e566c Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Fri, 5 Jun 2015 14:05:43 +0300 Subject: [PATCH 068/396] MAGETWO-38154: Create block for item level --- .../Item/Renderer/Actions/GiftOptions.php | 65 +++++++++++++++ .../Item/Renderer/Actions/GiftOptionsTest.php | 68 +++++++++++++++ .../layout/checkout_cart_item_renderers.xml | 82 +++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php create mode 100644 app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php create mode 100644 app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml 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 00000000000..157a0fb39fb --- /dev/null +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php @@ -0,0 +1,65 @@ +<?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|\Magento\Checkout\Block\Checkout\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() + { + foreach ($this->layoutProcessors as $processor) { + $this->jsLayout = $processor->process($this->jsLayout); + } + return $this->jsonEncoder->encode($this->jsLayout); + } +} 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 00000000000..890d7f88a9c --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php @@ -0,0 +1,68 @@ +<?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; + +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() + { + $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()); + } +} 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 00000000000..b38c8512db0 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml @@ -0,0 +1,82 @@ +<?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> + </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> + </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> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.downloadable.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.downloadable.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"/> + </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> + </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> + </item> + </argument> + </arguments> + </block> + </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.virtual.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.virtual.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"/> + </referenceBlock> + </body> +</page> -- GitLab From 32ed9022e3e3274f900e4a0b105a2e774794ad8a Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Fri, 5 Jun 2015 15:48:44 +0300 Subject: [PATCH 069/396] MAGETWO-38167: CatalogRule Refactoring --- app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php index 683f63b3201..cef79f4f737 100755 --- a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php +++ b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php @@ -529,7 +529,10 @@ class IndexBuilder )->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); -- GitLab From ec2eff6f1e830119496044d45be9b9d3f3b24ee5 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Fri, 5 Jun 2015 15:57:51 +0300 Subject: [PATCH 070/396] MAGETWO-38081: [UI] Assistance with applying new style for Gift Options --- .../templates/cart/item/default.phtml | 6 +- .../web/css/source/module/_cart.less | 18 +-- .../web/css/source/_module.less | 69 ++++++++--- .../web/css/source/module/_cart.less | 113 +++++------------- .../web/css/source/_module.less | 105 ++++++++++++++-- 5 files changed, 186 insertions(+), 125 deletions(-) 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 55fb44a6f84..a8018e4e200 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 @@ -121,11 +121,11 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <?php /* Temp MAGETWO-36023 markup */?> <a href="#" - class="action action-gift"> + class="action action-gift active"> <!-- add class "active" when it is clicked to show active state --> <span><?php echo __('Gift wrap'); ?></span> </a> - <div class="gift-content"> + <div class="gift-content active"> <!-- add class "active" to display the content --> <div class="gift-options"> <?php /* Gift Wrapping */ ?> <?php include ($block->getTemplateFile('Magento_GiftWrapping::checkout\new-options.phtml')); ?> @@ -204,7 +204,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima var giftWrappingCustom = { options: { - activeClass: '_active', + activeClass: 'active', giftOptions: '.gift-options', giftContainer: "[data-container='item-gift-container']", giftWrappingItem: '.gift-wrapping-item', 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 9ad50949bfe..f8aca74c98f 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 @@ -233,6 +233,7 @@ } } .actions-toolbar { + &:extend(.abs-add-clearfix all); > .action { &:extend(button all); .link-as-button(); @@ -249,20 +250,6 @@ font-weight: @font-weight__regular; } } - .action-gift { - .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 - ); - } - } .product { &-item-photo { display: block; @@ -390,8 +377,7 @@ .cart { &-container { &:extend(.abs-add-clearfix-desktop all); - .form-cart, - .cart-gift-item { + .form-cart { &:extend(.abs-shopping-cart-items-desktop all); } .widget { 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 fb52773925b..9d62f715822 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 @@ -31,13 +31,6 @@ } } - .item-gift { - display: none; - &._active { - display: table-row; - } - } - .gift-options { &:extend(.abs-add-clearfix all); } @@ -62,10 +55,37 @@ } } + // + // 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; + } + } + + .action-gift { + .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 + ); + } } } @@ -75,7 +95,7 @@ .gift-item-block { margin: 0; - &._active { + &.active { .title { .icon-font-symbol( @icon-up, @@ -196,6 +216,23 @@ 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 { + .action-gift { + width: 100%; + } + .gift-content { + border-bottom: @border-width__base solid @border-color__base; + margin-bottom: @indent__base; + } + } } // @@ -236,18 +273,22 @@ &: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 { - display: none; - clear: left; - float: left; - margin-right: -100%; - width: 100%; + padding: @indent__base 0; } } - } diff --git a/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less b/app/design/frontend/Magento/luma/Magento_Checkout/web/css/source/module/_cart.less index f4adc92d3de..147f5ab045f 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 @@ -292,11 +292,6 @@ padding-right: @mobile-cart-padding; white-space: normal; } - .actions-toolbar { - &:extend(.abs-add-clearfix all); - padding-bottom: 15px; - text-align: right; - } } .item { .col.item { @@ -306,8 +301,34 @@ position: relative; } } + + .actions-toolbar { + &:extend(.abs-add-clearfix all); + padding-bottom: 15px; + position: relative; + > .action-edit, + > .action-delete { + position: absolute; + right: 10px; + 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 + ); + } + } .action { - float: left; margin-right: @indent__m; &:last-child { margin-right: 0; @@ -317,25 +338,6 @@ font-weight: @font-weight__regular; } } - .action-edit, - .action-delete { - float: none; - .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 { - &:extend(.abs-action-button-as-link all); - .icon-font-symbol( - @_icon-font-content: @icon-trash - ); - } .product { &-item-photo { @@ -552,28 +554,6 @@ tbody > tr > td:last-child { border: 0; } - - .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 -16px -15px; - padding: 4px @indent__s 15px 14px; - &:after { - color: @primary__color; - } - } - } } &-totals { @@ -631,10 +611,6 @@ text-align: right; } } - .cart-gift-item { - &:extend(.abs-shopping-cart-items-desktop all); - margin-bottom: @indent__base; - } .widget { float: left; } @@ -683,20 +659,15 @@ } .item { - .col { - &.item { - padding: @cart-item-cell-padding-top 8px 20px 0; - } - } - &-actions td { - padding: 0; - text-align: left; - .actions-toolbar { - position: relative; - } + .col.item { + padding: @cart-item-cell-padding-top 8px 20px 0; } } + .item-actions td { + padding: 0; + } + .product { &-item-photo { display: table-cell; @@ -716,24 +687,6 @@ width: 99%; } } - - .action-gift { - .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; - } - } - } } // Discount 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 ab2e7396784..533af8ef698 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 @@ -41,16 +41,9 @@ } } - .item-gift { - display: none; - &._active { - display: table-row; - } - } - .cart.table-wrapper { .item-gift { - &._active { + &.active { .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); } .action { @@ -77,9 +70,6 @@ .gift-summary { position: relative; .actions-toolbar { - position: absolute; - right: 0; - top: 0; > .secondary { .action { margin: 0 0 0 @indent__base; @@ -106,6 +96,33 @@ ); } } + .gift-summary, + .cart.table-wrapper .gift-summary { + .actions-toolbar { + padding: 0; + position: absolute; + right: 0; + top: 0; + } + } + + // + // 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; + } + } + } // // Collapsible block @@ -114,7 +131,7 @@ .gift-item-block { .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); margin: 0; - &._active { + &.active { .title { &:after { .css(content, @gift-item-block-title-icon__active__content); @@ -234,6 +251,38 @@ .gift-message-summary { padding-right: 7rem; } + + .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; + } + } } // @@ -281,4 +330,36 @@ 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; + } + } + } + } + + .cart-container { + .cart-gift-item { + &:extend(.abs-shopping-cart-items-desktop all); + margin-bottom: @indent__base; + } + } } -- GitLab From 73550f38ea28b9a675b9cd440ef5a13f9ea5902e Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Fri, 5 Jun 2015 17:09:41 +0300 Subject: [PATCH 071/396] MAGETWO-38154: Create block for item level --- .../Item/Renderer/Actions/GiftOptions.php | 4 +- .../Item/Renderer/Actions/ItemIdProcessor.php | 34 +++++++++ .../Actions/LayoutProcessorInterface.php | 20 +++++ .../Item/Renderer/Actions/GiftOptionsTest.php | 13 +++- .../Renderer/Actions/ItemIdProcessorTest.php | 73 +++++++++++++++++++ .../Magento/GiftMessage/etc/frontend/di.xml | 7 ++ .../layout/checkout_cart_item_renderers.xml | 6 -- .../item/renderer/actions/gift_options.phtml | 23 ++++++ 8 files changed, 171 insertions(+), 9 deletions(-) create mode 100644 app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/ItemIdProcessor.php create mode 100644 app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/LayoutProcessorInterface.php create mode 100644 app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/ItemIdProcessorTest.php create mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml 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 index 157a0fb39fb..fdc9ab9b9b8 100644 --- a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php @@ -22,7 +22,7 @@ class GiftOptions extends Generic protected $jsLayout; /** - * @var array|\Magento\Checkout\Block\Checkout\LayoutProcessorInterface[] + * @var array|LayoutProcessorInterface[] */ protected $layoutProcessors; @@ -58,7 +58,7 @@ class GiftOptions extends Generic public function getJsLayout() { foreach ($this->layoutProcessors as $processor) { - $this->jsLayout = $processor->process($this->jsLayout); + $this->jsLayout = $processor->process($this->jsLayout, $this->getItem()); } return $this->jsonEncoder->encode($this->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 00000000000..e3a2d93376a --- /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 00000000000..5e8ecfacb3a --- /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/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php b/app/code/Magento/GiftMessage/Test/Unit/Block/Cart/Item/Renderer/Actions/GiftOptionsTest.php index 890d7f88a9c..0a3f3e89b7d 100644 --- 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 @@ -9,6 +9,7 @@ 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 { @@ -55,14 +56,24 @@ class GiftOptionsTest extends \PHPUnit_Framework_TestCase 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) + ->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 00000000000..3231c73acb7 --- /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/etc/frontend/di.xml b/app/code/Magento/GiftMessage/etc/frontend/di.xml index 36f49a653bd..e46293f688b 100644 --- a/app/code/Magento/GiftMessage/etc/frontend/di.xml +++ b/app/code/Magento/GiftMessage/etc/frontend/di.xml @@ -36,4 +36,11 @@ </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/view/frontend/layout/checkout_cart_item_renderers.xml b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_item_renderers.xml index b38c8512db0..a4c749f1f34 100644 --- 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 @@ -46,9 +46,6 @@ </arguments> </block> </referenceBlock> - <referenceBlock name="checkout.cart.item.renderers.downloadable.actions"> - <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.downloadable.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"/> - </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> @@ -75,8 +72,5 @@ </arguments> </block> </referenceBlock> - <referenceBlock name="checkout.cart.item.renderers.virtual.actions"> - <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.virtual.actions.gift_options" template="cart/item/renderer/actions/gift_options.phtml" before="-" cacheable="false"/> - </referenceBlock> </body> </page> 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 00000000000..18086f43ed9 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/Cart/item/renderer/actions/gift_options.phtml @@ -0,0 +1,23 @@ +<?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() ?>'"> + <!-- 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 ?> -- GitLab From 7d9005ec45efc78d23ae58d31e96496ae48efa67 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Fri, 5 Jun 2015 17:31:13 +0300 Subject: [PATCH 072/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - content for several modules was changed --- app/code/Magento/Backend/Block/Cache.php | 2 +- .../Controller/Adminhtml/Index/MassDelete.php | 2 +- app/code/Magento/Backup/Helper/Data.php | 2 +- .../adminhtml/layout/backup_index_block.xml | 2 +- .../Controller/Adminhtml/Import/Validate.php | 5 +++- .../Adminhtml/Indexer/MassChangelog.php | 2 +- .../Adminhtml/Indexer/MassOnTheFly.php | 2 +- .../view/frontend/templates/layer/state.phtml | 2 +- .../Model/Checkout/Type/Multishipping.php | 4 +-- .../templates/checkout/addresses.phtml | 4 +-- .../frontend/templates/checkout/billing.phtml | 2 +- .../frontend/templates/checkout/link.phtml | 2 +- .../frontend/templates/checkout/success.phtml | 2 +- .../Template/Grid/Renderer/Action.php | 2 +- .../Controller/Adminhtml/Queue/Save.php | 2 +- .../Adminhtml/Subscriber/MassDelete.php | 2 +- .../Controller/Adminhtml/Template/Delete.php | 2 +- .../Controller/Subscriber/Unsubscribe.php | 2 +- .../adminhtml/templates/template/edit.phtml | 2 +- .../Controller/Adminhtml/Term/MassDelete.php | 2 +- app/code/Magento/SendFriend/composer.json | 27 ------------------- .../Wishlist/Controller/Index/Send.php | 2 +- .../Test/Unit/Controller/Index/SendTest.php | 6 ++--- .../templates/layer/state.phtml | 2 +- .../Test/Block/Checkout/Addresses.php | 2 +- .../Customer/Controller/AccountTest.php | 5 ++-- .../Adminhtml/Import/ValidateTest.php | 1 + .../Adminhtml/NewsletterQueueTest.php | 2 +- 28 files changed, 36 insertions(+), 58 deletions(-) delete mode 100644 app/code/Magento/SendFriend/composer.json diff --git a/app/code/Magento/Backend/Block/Cache.php b/app/code/Magento/Backend/Block/Cache.php index a12377dda43..bbd3fc60f4e 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 = __('The 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/Backup/Controller/Adminhtml/Index/MassDelete.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php index cc5c2a93ee3..9980008a84c 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/MassDelete.php @@ -49,7 +49,7 @@ class MassDelete extends \Magento\Backup\Controller\Adminhtml\Index $resultData->setIsSuccess(true); if ($allBackupsDeleted) { - $this->messageManager->addSuccess(__('You deleted the selected backups.')); + $this->messageManager->addSuccess(__('You deleted the selected backup(s).')); } else { throw new \Exception($deleteFailMessage); } diff --git a/app/code/Magento/Backup/Helper/Data.php b/app/code/Magento/Backup/Helper/Data.php index f93a2f2628a..cc70c3eb28b 100644 --- a/app/code/Magento/Backup/Helper/Data.php +++ b/app/code/Magento/Backup/Helper/Data.php @@ -210,7 +210,7 @@ class Data extends \Magento\Framework\App\Helper\AbstractHelper $messagesMap = [ \Magento\Framework\Backup\Factory::TYPE_SYSTEM_SNAPSHOT => __('You created the system backup.'), \Magento\Framework\Backup\Factory::TYPE_SNAPSHOT_WITHOUT_MEDIA => __( - 'You created the system back (excluding media).' + 'You created the system backup (excluding media).' ), \Magento\Framework\Backup\Factory::TYPE_MEDIA => __('You created the database and media backup.'), \Magento\Framework\Backup\Factory::TYPE_DB => __('You created the database backup.'), diff --git a/app/code/Magento/Backup/view/adminhtml/layout/backup_index_block.xml b/app/code/Magento/Backup/view/adminhtml/layout/backup_index_block.xml index 5b2af1a196e..1553a783f63 100644 --- a/app/code/Magento/Backup/view/adminhtml/layout/backup_index_block.xml +++ b/app/code/Magento/Backup/view/adminhtml/layout/backup_index_block.xml @@ -24,7 +24,7 @@ <item name="delete" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Delete</item> <item name="url" xsi:type="string">backup/*/massDelete</item> - <item name="confirm" xsi:type="string" translate="true">Are you sure you want to delete he selected backups?</item> + <item name="confirm" xsi:type="string" translate="true">Are you sure you want to delete the selected backup(s)?</item> </item> </argument> </arguments> diff --git a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php index 041f040c677..cec1afd5fe1 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php @@ -97,7 +97,10 @@ class Validate extends ImportController true ); } else { - $resultBlock->addError(__('The file is valid, but we can\'t import it for some reason.'), false); + $resultBlock->addError( + __('The file is valid, but we can\'t import it for some reason.'), + false + ); } } $resultBlock->addNotice($import->getNotices()); diff --git a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php index 9c6457056fb..ba142fbb2f3 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 5490a56d0d6..27def97e6b1 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/LayeredNavigation/view/frontend/templates/layer/state.phtml b/app/code/Magento/LayeredNavigation/view/frontend/templates/layer/state.phtml index 0881ce5b799..57633279a47 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/Multishipping/Model/Checkout/Type/Multishipping.php b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php index 169e10c7195..c708767a773 100644 --- a/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php +++ b/app/code/Magento/Multishipping/Model/Checkout/Type/Multishipping.php @@ -594,10 +594,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/templates/checkout/addresses.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/addresses.phtml index 6250a70104f..a1005f26b01 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 __('Continue 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 c8071150dfe..434502fba3a 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 d48cb7b0720..505d2451abb 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 __('Checkout with Multiple Addresses');?></span></a> 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 aeb0de21440..a2371c2b40e 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 c099dde6c06..14cc0331724 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 39535cd89af..33fd2052a42 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 a16b3bfcf34..4ea5f85728e 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/Delete.php b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Delete.php index 2119e1e7a21..e7513c03dfa 100644 --- a/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Delete.php +++ b/app/code/Magento/Newsletter/Controller/Adminhtml/Template/Delete.php @@ -28,7 +28,7 @@ class Delete extends \Magento\Newsletter\Controller\Adminhtml\Template } catch (\Magento\Framework\Exception\LocalizedException $e) { $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { - $this->messageManager->addException($e, __('An error occurred while deleting this template.')); + $this->messageManager->addException($e, __('Something went wrong while deleting this template.')); } } $this->_redirect('*/template'); diff --git a/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php index bb28a220d87..37949cdae01 100644 --- a/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php +++ b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php @@ -24,7 +24,7 @@ class Unsubscribe extends \Magento\Newsletter\Controller\Subscriber } 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/view/adminhtml/templates/template/edit.phtml b/app/code/Magento/Newsletter/view/adminhtml/templates/template/edit.phtml index f208f4c4f22..e7700bf62f8 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 = ''; diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php b/app/code/Magento/Search/Controller/Adminhtml/Term/MassDelete.php index f704e4a7144..97586e38d64 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/SendFriend/composer.json b/app/code/Magento/SendFriend/composer.json deleted file mode 100644 index 20c2b6321fb..00000000000 --- a/app/code/Magento/SendFriend/composer.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "magento/module-send-friend", - "description": "N/A", - "require": { - "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta11", - "magento/module-catalog": "0.74.0-beta11", - "magento/module-customer": "0.74.0-beta11", - "magento/module-theme": "0.74.0-beta11", - "magento/framework": "0.74.0-beta11", - "magento/magento-composer-installer": "*" - }, - "type": "magento2-module", - "version": "0.74.0-beta11", - "license": [ - "OSL-3.0", - "AFL-3.0" - ], - "extra": { - "map": [ - [ - "*", - "Magento/SendFriend" - ] - ] - } -} diff --git a/app/code/Magento/Wishlist/Controller/Index/Send.php b/app/code/Magento/Wishlist/Controller/Index/Send.php index 8a6bd520cf1..532a97e4709 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/Test/Unit/Controller/Index/SendTest.php b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php index 335e55b583b..1a98e080789 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Controller/Index/SendTest.php @@ -378,9 +378,9 @@ class SendTest extends \PHPUnit_Framework_TestCase ['test text', 100, '', 1, 0, '', 'Email address can\'t be empty.'], ['test text', 100, 'user1@example.com', 1, 1, '', 'This wishlist can be shared 0 more times.'], ['test text', 100, 'u1@example.com, u2@example.com', 3, 2, '', 'This wishlist 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/design/frontend/Magento/luma/Magento_LayeredNavigation/templates/layer/state.phtml b/app/design/frontend/Magento/luma/Magento_LayeredNavigation/templates/layer/state.phtml index fc254e6017a..f06820d8370 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/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 8b8b16cd4f5..e38185913e5 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/integration/testsuite/Magento/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index 821a9b763b1..9f61e8db5b6 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -194,8 +194,9 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/account/index/')); $this->assertSessionMessages( $this->equalTo([ - 'You must confirm your account. Please check your e-mail for the confirmation link or <a href="' - . $email . '">click here</a> for a new link.', + 'You must confirm your account. Please check your e-mail 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 ); 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 3c922f0fd7d..ea7f4428801 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 @@ -4,6 +4,7 @@ * See COPYING.txt for license details. */ namespace Magento\ImportExport\Controller\Adminhtml\Import; + use Magento\Framework\Filesystem\DirectoryList; /** 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 63b8f840c85..facea396ed4 100644 --- a/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterQueueTest.php +++ b/dev/tests/integration/testsuite/Magento/Newsletter/Controller/Adminhtml/NewsletterQueueTest.php @@ -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 ); } -- GitLab From 6f5b2d150c95602534a09d7f50e3a6491b8257b3 Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Fri, 5 Jun 2015 17:54:13 +0300 Subject: [PATCH 073/396] MAGETWO-38154: Create block for item level --- .../Block/Cart/Item/Renderer/Actions/GiftOptions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index fdc9ab9b9b8..515a4c8cc0e 100644 --- a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php @@ -5,9 +5,9 @@ */ namespace Magento\GiftMessage\Block\Cart\Item\Renderer\Actions; -use \Magento\Backend\Block\Template\Context; +use Magento\Backend\Block\Template\Context; use Magento\Checkout\Block\Cart\Item\Renderer\Actions\Generic; -use \Magento\Framework\Json\Encoder; +use Magento\Framework\Json\Encoder; class GiftOptions extends Generic { -- GitLab From 881a72f5e0b07360e8fcef16f604295a125876eb Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Tue, 2 Jun 2015 18:13:11 +0300 Subject: [PATCH 074/396] MAGETWO-38259: Merge with mainline - Add drag&drop component - Merge with mainline --- .../ui_component/cms_block_listing.xml | 17 +- .../ui_component/cms_page_listing.xml | 19 +- .../view/base/web/js/core/renderer/layout.js | 4 + .../view/base/web/js/grid/columns/column.js | 84 +++- .../Ui/view/base/web/js/grid/columns/date.js | 6 +- .../base/web/js/grid/columns/multiselect.js | 42 +- .../view/base/web/js/grid/columns/select.js | 6 +- .../view/base/web/js/grid/columns/sortable.js | 81 ---- .../js/grid/controls/bookmarks/bookmarks.js | 6 +- .../view/base/web/js/grid/controls/columns.js | 45 +- .../Magento/Ui/view/base/web/js/grid/dnd.js | 446 ++++++++++++++++++ .../view/base/web/js/grid/filters/filters.js | 17 +- .../Ui/view/base/web/js/grid/listing.js | 82 +++- .../Ui/view/base/web/js/grid/massactions.js | 7 +- .../view/base/web/js/lib/component/links.js | 21 +- .../view/base/web/js/lib/component/manip.js | 83 ++-- .../Ui/view/base/web/js/lib/ko/bind/dnd.js | 25 + .../Ui/view/base/web/js/lib/ko/initialize.js | 1 + .../view/base/web/js/lib/registry/registry.js | 26 +- .../base/web/templates/grid/cells/text.html | 7 +- .../base/web/templates/grid/columns/text.html | 28 +- .../base/web/templates/grid/dnd/listing.html | 38 ++ .../view/base/web/templates/grid/listing.html | 12 +- .../web/css/source/module/_data-grid.less | 67 +++ .../backend/web/css/source/_classes.less | 8 + lib/web/mage/utils/arrays.js | 56 ++- lib/web/mage/utils/template.js | 14 +- 27 files changed, 1021 insertions(+), 227 deletions(-) delete mode 100644 app/code/Magento/Ui/view/base/web/js/grid/columns/sortable.js create mode 100644 app/code/Magento/Ui/view/base/web/js/grid/dnd.js create mode 100644 app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js create mode 100644 app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml index 44f4c1deea2..6adf2951c32 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml @@ -61,6 +61,9 @@ <container name="columns_controls"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="columnsData" xsi:type="array"> + <item name="provider" xsi:type="string">cms_block_listing.cms_block_listing.cms_block_columns</item> + </item> <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/columns</item> <item name="displayArea" xsi:type="string">dataGridActions</item> </item> @@ -275,10 +278,14 @@ <columns name="cms_block_columns"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="storageConfig" xsi:type="array"> + <item name="provider" xsi:type="string">cms_block_listing.cms_block_listing.listing_top.bookmarks</item> + <item name="namespace" xsi:type="string">current</item> + </item> <item name="childDefaults" xsi:type="array"> + <item name="controlVisibility" xsi:type="boolean">true</item> <item name="actionField" xsi:type="string">actions</item> <item name="clickAction" xsi:type="string">edit</item> - <item name="appendTo" xsi:type="string">cms_block_listing.cms_block_listing.listing_top.columns_controls</item> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">cms_block_listing.cms_block_listing.listing_top.bookmarks</item> <item name="root" xsi:type="string">columns.${ $.index }</item> @@ -294,14 +301,14 @@ </item> <item name="config" xsi:type="array"> <item name="indexField" xsi:type="string">block_id</item> - <item name="appendTo" xsi:type="boolean">false</item> + <item name="controlVisibility" xsi:type="boolean">false</item> </item> </argument> </column> <column name="block_id"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> @@ -314,7 +321,7 @@ <column name="title"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> @@ -326,7 +333,7 @@ <column name="identifier"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml index 7d154b524cd..a1f9c8c1b61 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml @@ -61,6 +61,9 @@ <container name="columns_controls"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="columnsData" xsi:type="array"> + <item name="provider" xsi:type="string">cms_page_listing.cms_page_listing.cms_page_columns</item> + </item> <item name="component" xsi:type="string">Magento_Ui/js/grid/controls/columns</item> <item name="displayArea" xsi:type="string">dataGridActions</item> </item> @@ -297,10 +300,14 @@ <columns name="cms_page_columns"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="storageConfig" xsi:type="array"> + <item name="provider" xsi:type="string">cms_page_listing.cms_page_listing.listing_top.bookmarks</item> + <item name="namespace" xsi:type="string">current</item> + </item> <item name="childDefaults" xsi:type="array"> <item name="actionField" xsi:type="string">actions</item> <item name="clickAction" xsi:type="string">edit</item> - <item name="appendTo" xsi:type="string">cms_page_listing.cms_page_listing.listing_top.columns_controls</item> + <item name="controlVisibility" xsi:type="boolean">true</item> <item name="storageConfig" xsi:type="array"> <item name="provider" xsi:type="string">cms_page_listing.cms_page_listing.listing_top.bookmarks</item> <item name="root" xsi:type="string">columns.${ $.index }</item> @@ -316,14 +323,14 @@ </item> <item name="config" xsi:type="array"> <item name="indexField" xsi:type="string">page_id</item> - <item name="appendTo" xsi:type="string"></item> + <item name="controlVisibility" xsi:type="boolean">false</item> </item> </argument> </column> <column name="page_id"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> @@ -336,7 +343,7 @@ <column name="title"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> @@ -348,7 +355,7 @@ <column name="identifier"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> @@ -373,7 +380,7 @@ <column name="store_id" class="Magento\Store\Ui\Component\Listing\Column\Store"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="bodyTmpl" xsi:type="string">ui/grid/cells/html</item> diff --git a/app/code/Magento/Ui/view/base/web/js/core/renderer/layout.js b/app/code/Magento/Ui/view/base/web/js/core/renderer/layout.js index 882fd49f464..4a0ceedf000 100644 --- a/app/code/Magento/Ui/view/base/web/js/core/renderer/layout.js +++ b/app/code/Magento/Ui/view/base/web/js/core/renderer/layout.js @@ -122,6 +122,10 @@ define([ delete node.type; delete node.config; + if (children) { + node.initChildCount = _.size(children); + } + if (node.isTemplate) { node.isTemplate = false; diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js index f0d3202c7f6..85f55771ae9 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js @@ -13,16 +13,34 @@ define([ defaults: { headerTmpl: 'ui/grid/columns/text', bodyTmpl: 'ui/grid/cells/text', - sortable: false, + sortable: true, + sorting: false, visible: true, + dragging: false, + dragover: false, links: { - visible: '${ $.storageConfig.path }.visible' + visible: '${ $.storageConfig.path }.visible', + sorting: '${ $.storageConfig.path }.sorting' + }, + imports: { + exportSorting: 'sorting' + }, + listens: { + '${ $.provider }:params.sorting.field': 'onSortChange' + }, + modules: { + source: '${ $.provider }' } }, + /** + * Initializes observable properties. + * + * @returns {Column} Chainable. + */ initObservable: function () { this._super() - .observe('visible'); + .observe('visible dragging dragover sorting'); return this; }, @@ -46,6 +64,39 @@ define([ } }, + sort: function (enabled) { + var direction; + + if (!this.sortable) { + return; + } + + direction = enabled !== false ? + this.sorting() ? + this.toggleDirection() : + 'asc' : + false; + + this.sorting(direction); + }, + + exportSorting: function (sorting) { + if (!sorting) { + return; + } + + this.source('set', 'params.sorting', { + field: this.index, + direction: sorting + }); + }, + + toggleDirection: function () { + return this.sorting() === 'asc' ? + 'desc' : + 'asc'; + }, + getClickUrl: function (row) { var field = row[this.actionField], action = field && field[this.clickAction]; @@ -61,16 +112,43 @@ define([ window.location.href = url; }, + /** + * Ment to preprocess data associated with a current columns' field. + * + * @param {*} data - Data to be preprocessed. + * @returns {String} + */ getLabel: function (data) { return data; }, + /** + * Returns path to the columns' header template. + * + * @returns {String} + */ getHeader: function () { return this.headerTmpl; }, + /** + * Returns path to the columns' body template. + * + * @returns {String} + */ getBody: function () { return this.bodyTmpl; + }, + + /** + * Listener of the providers' sorting state changes. + * + * @param {Srting} field - Field by which current sorting is performed. + */ + onSortChange: function (field) { + if (field !== this.index) { + this.sort(false); + } } }); }); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js index 3393c0094a8..be518ae7c3c 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js @@ -5,11 +5,11 @@ define([ 'mageUtils', 'moment', - './sortable' -], function (utils, moment, Sortable) { + './column' +], function (utils, moment, Column) { 'use strict'; - return Sortable.extend({ + return Column.extend({ defaults: { dateFormat: 'MMM D, YYYY h:mm:ss A' }, diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js index e6b33d1e628..423f6079590 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js @@ -13,6 +13,7 @@ define([ defaults: { headerTmpl: 'ui/grid/columns/multiselect', bodyTmpl: 'ui/grid/cells/multiselect', + sortable: false, menuVisible: false, excludeMode: false, allSelected: false, @@ -87,7 +88,10 @@ define([ }, /** - * Selects all grid records, even those that are not visible on the page. + * Selects all grid records, even those that + * are not visible on the page. + * + * @returns {Multiselect} Chainable. */ selectAll: function () { this.excludeMode(true); @@ -100,44 +104,54 @@ define([ /** * Deselects all grid records. + * + * @returns {Multiselect} Chainable. */ deselectAll: function () { this.excludeMode(false); this.clearExcluded() - .deselectPage(); - this.selected.removeAll(); + .selected.removeAll(); return this; }, /** * Selects or deselects all records. + * + * @returns {Multiselect} Chainable. */ toggleSelectAll: function () { - return this.allSelected() ? - this.deselectAll() : - this.selectAll(); + this.allSelected() ? + this.deselectAll() : + this.selectAll(); + + return this; }, /** * Selects all records on the current page. + * + * @returns {Multiselect} Chainable. */ selectPage: function () { - this.selected( - _.union(this.selected(), this.getIds()) - ); + var selected = _.union(this.selected(), this.getIds()); + + this.selected(selected); return this; }, /** * Deselects all records on the current page. + * + * @returns {Multiselect} Chainable. */ deselectPage: function () { - var currentPageIds = this.getIds(); + var pageIds = this.getIds(); + this.selected.remove(function (value) { - return currentPageIds.indexOf(value) !== -1; + return !!~pageIds.indexOf(value); }); return this; @@ -286,6 +300,8 @@ define([ /** * Updates values of the 'allSelected' * and 'indetermine' properties. + * + * @returns {Multiselect} Chainable. */ updateState: function () { var selected = this.selected().length, @@ -309,9 +325,9 @@ define([ }, /** - * Callback method to handle change of the selected items. + * Callback method to handle changes of selected items. * - * @param {Array} selected - List of the currently selected items. + * @param {Array} selected - An array of currently selected items. */ onSelectedChange: function (selected) { this.updateExcluded(selected) diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js index 54185ef6617..2985ecccc72 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js @@ -3,11 +3,11 @@ * See COPYING.txt for license details. */ define([ - './sortable' -], function (Sortable) { + './column' +], function (Column) { 'use strict'; - return Sortable.extend({ + return Column.extend({ getLabel: function (data) { var options = this.options || [], label = ''; diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/sortable.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/sortable.js deleted file mode 100644 index d54971607c3..00000000000 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/sortable.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -define([ - './column' -], function (Column) { - 'use strict'; - - return Column.extend({ - defaults: { - sortable: true, - sorting: false, - classes: { - 'asc': '_ascend', - 'desc': '_descend' - }, - links: { - sorting: '${ $.storageConfig.path }.sorting' - }, - imports: { - setSortClass: 'sorting', - push: 'sorting' - }, - listens: { - '${ $.provider }:params.sorting.field': 'onSortChange' - }, - modules: { - source: '${ $.provider }' - } - }, - - initObservable: function () { - this._super() - .observe('sorting sortClass'); - - return this; - }, - - sort: function (enabled) { - var direction; - - direction = enabled !== false ? - this.sorting() ? - this.toggleDirection() : - 'asc' : - false; - - this.sorting(direction); - }, - - push: function (sorting) { - if (!sorting) { - return; - } - - this.source('set', 'params.sorting', { - field: this.index, - direction: sorting - }); - }, - - toggleDirection: function () { - return this.sorting() === 'asc' ? - 'desc' : - 'asc'; - }, - - setSortClass: function (sorting) { - var sortClass = this.classes[sorting] || ''; - - this.sortClass(sortClass); - }, - - onSortChange: function (field) { - if (field !== this.index) { - this.sort(false); - } - } - }); -}); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js index 78a115f2498..ba06ff4f75a 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js @@ -59,8 +59,8 @@ define([ */ initialize: function () { utils.limit(this, 'saveSate', 2000); - utils.limit(this, 'checkChanges', 200); utils.limit(this, '_defaultPolyfill', 1000); + utils.limit(this, 'checkChanges', 50); this._super() .initViews(); @@ -223,7 +223,9 @@ define([ */ applyView: function (view) { if (typeof view === 'string') { - view = this.elems.findWhere({index: view}); + view = this.elems.findWhere({ + index: view + }); } view.active(true); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js b/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js index f48a86abab1..4782e7cde8a 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js @@ -3,10 +3,11 @@ * See COPYING.txt for license details. */ define([ + 'underscore', 'mageUtils', 'mage/translate', 'Magento_Ui/js/lib/collapsible' -], function (utils, $t, Collapsible) { +], function (_, utils, $t, Collapsible) { 'use strict'; return Collapsible.extend({ @@ -15,13 +16,21 @@ define([ minVisible: 1, maxVisible: 30, viewportSize: 18, + columnsData: { + container: 'elems' + }, + imports: { + addColumns: '${ $.columnsData.provider }:${ $.columnsData.container }' + }, templates: { headerMsg: $t('${ $.visible } out of ${ $.total } visible') } }, /** - * Action Reset + * Resets columns visibility to theirs default state. + * + * @returns {Columns} Chainable. */ reset: function () { this.elems.each('applyState', 'visible', 'default'); @@ -30,7 +39,9 @@ define([ }, /** - * Action Cancel + * Applies last saved state of columns visibility. + * + * @returns {Columns} Chainable. */ cancel: function () { this.elems.each('applyState', 'visible', 'last'); @@ -39,8 +50,25 @@ define([ }, /** - * Helper, which helps to stop resizing. - * viewportSize limits number of elements. + * Extends child elements array with provided one. + * + * @param {Array} columns - Elements array that will be added to component. + * @returns {Columns} Chainable. + */ + addColumns: function (columns) { + columns = _.where(columns, { + controlVisibility: true + }); + + this.insertChild(columns); + + return this; + }, + + /** + * Defines whether child elements array length + * is greater than the 'viewportSize' property. + * * @returns {Boolean} */ hasOverflow: function () { @@ -51,6 +79,7 @@ define([ * Helper, checks * - if less than one item choosen * - if more then viewportMaxSize choosen + * * @param {Object} elem * @returns {Boolean} */ @@ -63,7 +92,8 @@ define([ }, /** - * Helper, returns number of visible checkboxes + * Counts number of visible columns. + * * @returns {Number} */ countVisible: function () { @@ -72,8 +102,7 @@ define([ /** * Compile header message from headerMessage setting. - * Expects Underscore template format - * @param {String} text - underscore-format template + * * @returns {String} */ getHeaderMessage: function () { diff --git a/app/code/Magento/Ui/view/base/web/js/grid/dnd.js b/app/code/Magento/Ui/view/base/web/js/grid/dnd.js new file mode 100644 index 00000000000..3887a158337 --- /dev/null +++ b/app/code/Magento/Ui/view/base/web/js/grid/dnd.js @@ -0,0 +1,446 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +define([ + 'ko', + 'jquery', + 'underscore', + 'Magento_Ui/js/lib/class' +], function (ko, $, _, Class) { + 'use strict'; + + var isTouchDevice = typeof document.ontouchstart !== 'undefined', + transformProp; + + /** + * Defines vendor prefix for the css 'transform' property. + */ + transformProp = (function () { + var style = document.body.style, + base = 'Transform', + vendors = ['webkit', 'moz', 'ms', 'o'], + vi = vendors.length, + property; + + if (typeof style.transform !== 'undefined') { + return 'transform'; + } + + while (vi--) { + property = vendors[vi] + base; + + if (typeof style[property] !== 'undefined') { + return property; + } + } + })(); + + /** + * Returns first touch data if it's available. + * + * @returns {Object} + */ + function getTouch(e) { + return e.touches ? e.touches[0] : e; + } + + /** + * Moves specified DOM element to the x and y coordinates. + * + * @param {HTMLElement} elem - Element to be relocated. + * @param {Number} x - Value on the 'x' axis. + * @param {Number} y - Value on the 'y' axis. + */ + function locate(elem, x, y) { + var value = 'translate(' + x + 'px,' + y + 'px)'; + + elem.style[transformProp] = value; + } + + /** + * Checks if specified coordinate is inside of the provided area. + * + * @param {Number} x - Value on the 'x' axis. + * @param {Number} y - Value on the 'y' axis. + * @param {Object} area - Object which represents area. + * @returns {Boolean} + */ + function isInside(x, y, area) { + return ( + area && + x >= area.left && x <= area.right && + y >= area.top && y <= area.bottom + ); + } + + /** + * Calculates distance between two points. + * + * @param {Number} x1 - X coordinate of a first point. + * @param {Number} y1 - Y coordinate of a first point. + * @param {Number} x2 - X coordinate of a second point. + * @param {Number} y2 - Y coordinate of a second point. + * @returns {Number} Distance between points. + */ + function distance(x1, y1, x2, y2) { + var dx = x2 - x1, + dy = y2 - y1; + + dx *= dx; + dy *= dy; + + return Math.sqrt(dx + dy); + } + + /** + * Returns viewModel associated with a provided DOM element. + * + * @param {HTMLElement} elem + * @returns {Object|Array} + */ + function getModel(elem) { + return ko.contextFor(elem).$data; + } + + return Class.extend({ + defaults: { + columnsSelector: '', + dragGridSelector: '', + noSelectClass: '_no-select', + hiddenClass: '_hidden', + fixedX: false, + fixedY: true, + minDistance: 2 + }, + + /** + * Initializes Dnd component. + * + * @returns {Dnd} Chainable. + */ + initialize: function () { + _.bindAll(this, 'onMouseMove', 'onMouseUp', 'onMouseDown'); + + this._super() + .initColumns() + .initListeners(); + + return this; + }, + + /** + * Searches document for the columns elements. + * + * @returns {Dnd} Chainable. + */ + initColumns: function () { + var columns = this.grid.querySelectorAll(this.columnsSelector); + + this.$body = $('body'); + + this.dragGrid = document.querySelector(this.dragGridSelector); + this.columns = _.toArray(columns); + + return this; + }, + + /** + * Binds necessary events listeners. + * + * @returns {Dnd} Chainbale. + */ + initListeners: function () { + if (isTouchDevice) { + document.addEventListener('touchmove', this.onMouseMove, false); + document.addEventListener('touchend', this.onMouseUp, false); + document.addEventListener('touchleave', this.onMouseUp, false); + } else { + document.addEventListener('mousemove', this.onMouseMove, false); + document.addEventListener('mouseup', this.onMouseUp, false); + } + + this.columns.forEach(function (column) { + isTouchDevice ? + column.addEventListener('touchstart', this.onMouseDown, false) : + column.addEventListener('mousedown', this.onMouseDown, false); + }, this); + + return this; + }, + + /** + * Calculates coordinates of draggable elements. + * + * @returns {Dnd} Chainbale. + */ + _cacheCoords: function () { + var container = this.grid.getBoundingClientRect(), + bodyRect = document.body.getBoundingClientRect(), + grabbed = this.grabbed, + dragElem = grabbed.elem, + cells = _.toArray(dragElem.parentNode.cells), + rect; + + this.coords = this.columns.map(function (column) { + var data; + + rect = column.getBoundingClientRect(); + + data = { + index: cells.indexOf(column), + target: column, + orig: rect, + left: rect.left - bodyRect.left, + right: rect.right - bodyRect.left, + top: rect.top - bodyRect.top, + bottom: container.bottom - bodyRect.top + }; + + if (column === dragElem) { + this.dragArea = data; + + grabbed.shiftX = rect.left - grabbed.x; + grabbed.shiftY = rect.top - grabbed.y; + } + + return data; + }, this); + + return this; + }, + + /** + * Coppies dimensions of a grabbed column + * to a draggable grid. + * + * @param {HTMLTableHeaderCellElement} elem - Grabbed column. + * @returns {Dnd} Chainable. + */ + _copyDimensions: function (elem) { + var dragGrid = this.dragGrid, + dragTrs = dragGrid.tBodies[0].children, + origTrs = _.toArray(this.grid.tBodies[0].children), + columnIndex = _.toArray(elem.parentNode.cells).indexOf(elem), + origTd; + + dragGrid.style.width = elem.offsetWidth + 'px'; + dragGrid.tHead.firstElementChild.cells[0].style.height = elem.offsetHeight + 'px'; + + origTrs.forEach(function (origTr, rowIndex) { + origTd = origTr.cells[columnIndex]; + + if (origTd) { + dragTrs[rowIndex].cells[0].style.height = origTd.offsetHeight + 'px'; + } + }); + + return this; + }, + + /** + * Matches provided coordinates to available areas. + * + * @param {Number} x - X coordinate. + * @param {Number} y - Y coordinate. + * @returns {Object|Undefined} Matched area. + */ + _getDropArea: function (x, y) { + return _.find(this.coords, function (area) { + return isInside(x, y, area); + }); + }, + + /** + * Updates state of hovered areas. + * + * @param {Number} x + * @param {Number} y + */ + _updateAreas: function (x, y) { + var leavedArea = this.dropArea, + area = this.dropArea = this._getDropArea(x, y); + + if (leavedArea) { + this.dragleave(leavedArea); + } + + if (area && area.target !== this.dragArea.target) { + this.dragenter(area); + } + }, + + /** + * Dragstart action handler. + * + * @param {HTMLElement} elem - Element which is dragging. + */ + dragstart: function (elem) { + this.initDrag = false; + this.dropArea = false; + this.dragging = true; + + getModel(elem).dragging(true); + + this._cacheCoords() + ._copyDimensions(elem); + + $(this.dragGrid).removeClass(this.hiddenClass); + }, + + /** + * Dragend action handler. + * + * @param {HTMLElement} elem - Element that was dragged. + */ + dragend: function (elem) { + var area = this.dropArea; + + this.$body.removeClass(this.noSelectClass); + + this.initDrag = false; + + if (!this.dragging) { + return; + } + + this.dragging = false; + + $(this.dragGrid).addClass(this.hiddenClass); + + getModel(elem).dragging(false); + + if (area && area.target !== elem) { + this.drop(area.target, elem); + } + }, + + /** + * Dragenter action handler. + * + * @param {Object} area + */ + dragenter: function (area) { + var elem = area.target, + drag = this.dragArea, + direction = drag.index < area.index ? 'left' : 'right'; + + getModel(elem).dragover(direction); + }, + + /** + * Dragleave action handler. + * + * @param {Object} area + */ + dragleave: function (area) { + getModel(area.target).dragover(false); + }, + + /** + * Drop action handler. + * + * @param {HTMLElement} target + * @param {HTMLElement} elem + */ + drop: function (target, elem) { + target = getModel(target); + elem = getModel(elem); + + getModel(this.grid).insertChild(elem, target); + target.dragover(false); + }, + + /** + * Drag action handler. Locates draggable + * grid at a specified coordinates. + * + * @param {Number} x - X coordinate. + * @param {Number} y - Y coordinate. + */ + drag: function (x, y) { + var grabbed = this.grabbed, + dragArea = this.dragArea, + posX = x + grabbed.shiftX, + posY = y + grabbed.shiftY; + + if (this.fixedX) { + x = dragArea.left; + posX = dragArea.orig.left; + } + + if (this.fixedY) { + y = dragArea.top; + posY = dragArea.orig.top; + } + + locate(this.dragGrid, posX, posY); + + if (!isInside(x, y, this.dropArea)) { + this._updateAreas(x, y); + } + }, + + /** + * Grab action handler. + * + * @param {Number} x - Coordinate of a grabbed point on 'x' axis. + * @param {Number} y - Coordinate of a grabbed point on 'y' axis. + * @param {HTMLElement} target - Grabbed elemenet. + */ + grab: function (x, y, target) { + this.initDrag = true; + this.grabbed = { + x: x, + y: y, + elem: target + }; + + this.$body.addClass(this.noSelectClass); + }, + + /** + * Documents' 'mousemove' event handler. + * + * @param {(MouseEvent|TouchEvent)} e - Event object. + */ + onMouseMove: function (e) { + var grab = this.grabbed, + touch = getTouch(e), + x = touch.pageX, + y = touch.pageY; + + if (this.initDrag || this.dragging) { + e.preventDefault(); + } + + if (this.initDrag && distance(x, y, grab.x, grab.y) >= this.minDistance) { + this.dragstart(grab.elem); + } + + if (this.dragging) { + this.drag(x, y); + } + }, + + /** + * Documents' 'mouseup' event handler. + */ + onMouseUp: function () { + if (this.initDrag || this.dragging) { + this.dragend(this.grabbed.elem); + } + }, + + /** + * Columns' 'mousedown' event handler. + * + * @param {(MouseEvent|TouchEvent)} e - Event object. + */ + onMouseDown: function (e) { + var touch = getTouch(e); + + this.grab(touch.pageX, touch.pageY, e.currentTarget); + } + }); +}); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js b/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js index bcd26c0f6fa..558e6629a16 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/filters/filters.js @@ -5,8 +5,9 @@ define([ 'underscore', 'mageUtils', + 'Magento_Ui/js/core/renderer/layout', 'Magento_Ui/js/lib/collapsible' -], function (_, utils, Collapsible) { +], function (_, utils, layout, Collapsible) { 'use strict'; function extractPreview(elem) { @@ -39,15 +40,15 @@ define([ filters: { placeholder: true }, - listens: { - active: 'extractPreviews', - applied: 'cancel extractActive' - }, links: { applied: '${ $.storageConfig.path }' }, exports: { applied: '${ $.provider }:params.filters' + }, + listens: { + active: 'updatePreviews', + applied: 'cancel extractActive' } }, @@ -57,6 +58,8 @@ define([ * @returns {Filters} Chainable. */ initialize: function () { + this._processedColumns = {}; + this._super() .cancel() .extractActive(); @@ -182,12 +185,12 @@ define([ }, /** - * Extract previews of a specified filters. + * Updates previews of a specified filters. * * @param {Array} filters - Filters to be processed. * @returns {Filters} Chainable. */ - extractPreviews: function (filters) { + updatePreviews: function (filters) { var previews = filters.map(extractPreview); this.previews(_.compact(previews)); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/listing.js b/app/code/Magento/Ui/view/base/web/js/grid/listing.js index fd7d70f9f7f..13653fb0067 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/listing.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/listing.js @@ -3,18 +3,25 @@ * See COPYING.txt for license details. */ define([ + 'mageUtils', + 'underscore', 'uiComponent', 'Magento_Ui/js/lib/spinner' -], function (Component, loader) { +], function (utils, _, Component, loader) { 'use strict'; return Component.extend({ defaults: { template: 'ui/grid/listing', + positions: false, + storageConfig: { + positions: '${ $.storageConfig.path }.positions' + }, imports: { rows: '${ $.provider }:data.items' }, listens: { + elems: 'setPositions', '${ $.provider }:reload': 'showLoader', '${ $.provider }:reloaded': 'hideLoader' } @@ -32,6 +39,79 @@ define([ return this; }, + /** + * Called when another element was added to current component. + * + * @returns {Listing} Chainable. + */ + initElement: function () { + var currentCount = this.elems().length, + totalCount = this.initChildCount; + + if (totalCount === currentCount) { + this.initPositions(); + } + + return this._super(); + }, + + /** + * Defines initial order of child elements. + * + * @returns {Listing} Chainable. + */ + initPositions: function () { + var link = { + positions: this.storageConfig.positions + }; + + this.on('positions', this.applyPositions.bind(this)); + + this.setLinks(link, 'imports') + .setLinks(link, 'exports'); + + return this; + }, + + /** + * Updates current state of child positions. + * + * @returns {Listing} Chainable. + */ + setPositions: function () { + var positions = {}; + + this.elems.each(function (elem, index) { + positions[elem.index] = index; + }); + + this.set('positions', positions); + + return this; + }, + + /** + * Reseorts child elements array according to provided positions. + * + * @param {Object} positions - Object where key represents child + * index and value is its' position. + * @returns {Listing} Chainable. + */ + applyPositions: function (positions) { + var sorting; + + sorting = this.elems.map(function (elem) { + return { + elem: elem, + position: positions[elem.index] + }; + }); + + this.insertChild(sorting); + + return this; + }, + /** * Hides loader. */ diff --git a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js index 35c792feaba..cc7134b953e 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js @@ -5,14 +5,15 @@ define([ 'underscore', 'mageUtils', + 'mage/translate', 'Magento_Ui/js/lib/collapsible' -], function (_, utils, Collapsible) { +], function (_, utils, $t, Collapsible) { 'use strict'; return Collapsible.extend({ defaults: { template: 'ui/grid/actions', - noItems: 'You haven\'t selected any items!' + noItemsMsg: $t('You haven\'t selected any items!') }, applyAction: function (action) { @@ -22,7 +23,7 @@ define([ if (!selections || !selections.total) { proceed = false; - alert(this.noItems); + alert(this.noItemsMsg); } if (proceed && action.confirm) { diff --git a/app/code/Magento/Ui/view/base/web/js/lib/component/links.js b/app/code/Magento/Ui/view/base/web/js/lib/component/links.js index 94df6c5d22c..deecc3fa9a1 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/component/links.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/component/links.js @@ -81,22 +81,19 @@ define([ } function setLinked(map, data) { - var hasLink, - match; - + var match; + if (!map) { return; } - hasLink = map.some(function (item) { - match = item; - - return !item.linked && - item.target === data.target && - item.property === data.property; + match = _.findWhere(map, { + linked: false, + target: data.target, + property: data.property }); - if (hasLink) { + if (match) { match.linked = data; data.linked = match; } @@ -106,6 +103,8 @@ define([ var direction = data.direction, map = maps[direction]; + data.linked = false; + (map[property] = map[property] || []).push(data); direction = direction === 'imports' ? 'exports' : 'imports'; @@ -165,7 +164,7 @@ define([ }); }); }); - + return this; }, diff --git a/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js b/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js index cc82f645030..2d9f55d131d 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js @@ -10,45 +10,17 @@ define([ ], function (ko, _, utils, registry) { 'use strict'; - function getIndex(container, target) { - var result; - - container.some(function (item, index) { - result = index; - - return item && (item.name === target || item === target); - }); - - return result; - } - function compact(container) { return container.filter(utils.isObject); } - function reserve(container, elem, position) { - var offset = position, - target; - - if (_.isObject(position)) { - target = position.after || position.before; - offset = getIndex(container, target); - - if (position.after) { - ++offset; - } - } - - offset = utils.formatOffset(container, offset); - - container[offset] ? - container.splice(offset, 0, elem) : - container[offset] = elem; - - return offset; - } - return { + /** + * Retrieves requested region. + * Creates region if it was not created yet + * + * @returns {ObservableArray}. + */ getRegion: function (name) { var regions = this.regions = this.regions || {}; @@ -59,23 +31,58 @@ define([ return regions[name]; }, + /** + * Replaces specified regions' data with a provided one. + * Creates region if it was not created yet. + * + * @param {Array} items - New regions' data. + * @param {String} name - Name of the region. + * @returns {Component} Chainable. + */ updateRegion: function (items, name) { var region = this.getRegion(name); region(items); + + return this; }, /** * Requests specified components to insert * them into 'elems' array starting from provided position. * - * @param {String} elem - Name of the component to insert. + * @param {String} elems - Name of the component to insert. * @param {Number} [position=-1] - Position at which to insert elements. * @returns {Component} Chainable. */ - insertChild: function (elem, position) { - reserve(this._elems, elem, position); - registry.get(elem, this._insert); + insertChild: function (elems, position) { + var container = this._elems, + newItems = [], + newItem; + + if (Array.isArray(elems)) { + newItems = elems.map(function (item) { + newItem = item.elem ? + utils.insert(item.elem, item.position, container) : + utils.insert(item, position, container); + + return newItem; + }); + } else { + newItems.push(utils.insert(elems, position, container)); + } + + newItems.forEach(function (item) { + if (!item) { + return; + } + + _.isString(item) ? + registry.get(item, this._insert) : + this._insert(item); + }, this); + + this._update(); return this; }, diff --git a/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js b/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js new file mode 100644 index 00000000000..a45799bbdff --- /dev/null +++ b/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js @@ -0,0 +1,25 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +define([ + 'ko', + 'jquery', + 'Magento_Ui/js/grid/dnd' +], function (ko, $, Dnd) { + 'use strict'; + + ko.bindingHandlers.gridDnd = { + init: function (element, valueAccessor, allBindings, viewModel) { + var callback = valueAccessor(); + + setTimeout(function () { + new Dnd({ + grid: element, + dragGridSelector: '.data-grid._dragging-copy', + columnsSelector: 'thead th._draggable' + }); + }, 2000); + } + }; +}); diff --git a/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js b/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js index a8bb4a15077..4f79b257c6f 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js @@ -14,6 +14,7 @@ define([ './bind/optgroup', './bind/fadeVisible', './bind/mage-init', + './bind/dnd', './extender/observable_array' ], function(ko, templateEngine) { 'use strict'; diff --git a/app/code/Magento/Ui/view/base/web/js/lib/registry/registry.js b/app/code/Magento/Ui/view/base/web/js/lib/registry/registry.js index adf6b9176b4..4bf6b21f686 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/registry/registry.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/registry/registry.js @@ -7,23 +7,23 @@ define([ 'underscore', './storage', './events' -], function(utils, _, Storage, Events) { +], function (utils, _, Storage, Events) { 'use strict'; - function async(name, registry, method) { + function async(name, registry, method) { var args = _.toArray(arguments).slice(3); if (_.isString(method)) { registry.get(name, function (component) { - component[method].apply(component, args); + component[method].apply(component, args); }); } else if (_.isFunction(method)) { - registry.get(name, method); + registry.get(name, method); } else if (!args.length) { return registry.get(name); } - } - + } + function Registry() { this.storage = new Storage(); this.events = new Events(this.storage); @@ -35,9 +35,9 @@ define([ /** * Retrieves data from registry. * - * @params {(String|Array)} elems - + * @param {(String|Array)} elems - * An array of elements' names or a string of names divided by spaces. - * @params {Function} [callback] - + * @param {Function} [callback] - * Callback function that will be triggered * when all of the elements are registered. * @returns {Array|*|Undefined} @@ -45,7 +45,7 @@ define([ * or an element itself if only is requested. * If callback function is specified then returns 'undefined'. */ - get: function(elems, callback) { + get: function (elems, callback) { var records; elems = utils.stringToArray(elems) || []; @@ -64,8 +64,8 @@ define([ /** * Sets data to registry. * - * @params {String} elems - Elements' name. - * @params {*} value - Value that will be assigned to the element. + * @param {String} elem - Elements' name. + * @param {*} value - Value that will be assigned to the element. * @returns {registry} Chainable. */ set: function (elem, value) { @@ -77,7 +77,7 @@ define([ /** * Removes specified elements from a storage. - * @params {(String|Array)} elems - + * @param {(String|Array)} elems - * An array of elements' names or a string of names divided by spaces. * @returns {registry} Chainable. */ @@ -92,7 +92,7 @@ define([ /** * Checks whether specified elements has been registered. * - * @params {(String|Array)} elems - + * @param {(String|Array)} elems - * An array of elements' names or a string of names divided by spaces. * @returns {Boolean} */ diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html b/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html index 257b4b0585d..1b06734b437 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html @@ -4,8 +4,9 @@ * See COPYING.txt for license details. */ --> -<td +<td data-bind="visible: visible, - click: isClickable(row) ? redirect.bind($data, getClickUrl(row)) : false, - text: getLabel(row[field.index])" + css: { _dragging: dragging }, + click: isClickable(row) ? redirect.bind($data, getClickUrl(row)) : false, + html: getLabel(row[field.index])" data-action="grid-row-edit"></td> \ No newline at end of file diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html b/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html index dc7b883659a..2ecd156587d 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html @@ -4,17 +4,17 @@ * See COPYING.txt for license details. */ --> - -<!-- ko if: sortable --> - <th - class="data-grid-th _sortable" - data-bind="css: sortClass, click: sort, visible: visible"> - <span data-bind="text: label"></span> - </th> -<!-- /ko --> - -<!-- ko ifnot: sortable --> - <th class="data-grid-th" data-bind="visible: visible"> - <span data-bind="text: label"></span> - </th> -<!-- /ko --> +<th + class="data-grid-th _draggable" + data-bind=" + css: { + '_sortable': sortable, + '_ascend': sorting() === 'asc', + '_descend': sorting() === 'desc', + '_dragover-left': dragover() === 'right', + '_dragover-right': dragover() === 'left' + }, + click: sort, + visible: visible"> + <span data-bind="text: label"></span> +</th> diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html b/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html new file mode 100644 index 00000000000..1a29fe19483 --- /dev/null +++ b/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html @@ -0,0 +1,38 @@ + +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<table class="data-grid _dragging-copy _hidden"> + <thead data-part="head"> + <tr data-part="head.row"> + <!-- ko foreach: elems --> + <!-- ko if: dragging --> + <!-- ko template: getHeader() --><!-- /ko --> + <!-- /ko --> + <!-- /ko --> + </tr> + </thead> + <tbody data-part="body"> + <!-- ko if: hasData() --> + <!-- ko foreach: { data: rows, as: 'row' } --> + <tr data-part="body.row"> + <!-- ko foreach: { data: $parent.elems, as: 'field' } --> + <!-- ko if: dragging --> + <!-- ko template: getBody() --><!-- /ko --> + <!-- /ko --> + <!-- /ko --> + </tr> + <!-- /ko --> + <!-- /ko --> + + <!-- ko ifnot: hasData() --> + <tr class="data-grid-tr-no-data"> + <td data-bind="attr: { colspan: getColspan() }, + text: $t('We couldn\'t find any records.')"></td> + </tr> + <!-- /ko --> + </tbody> +</table> \ No newline at end of file diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/listing.html b/app/code/Magento/Ui/view/base/web/templates/grid/listing.html index c3de27d5c7e..b57216bceb6 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/listing.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/listing.html @@ -4,15 +4,12 @@ * See COPYING.txt for license details. */ --> - <div class="admin__data-grid-wrap"> - <table class="data-grid"> + <table class="data-grid data-grid-draggable" data-bind="gridDnd"> <thead data-part="head"> <tr data-part="head.row"> <!-- ko foreach: elems --> - <!-- ko if: visible --> - <!-- ko template: getHeader() --><!-- /ko --> - <!-- /ko --> + <!-- ko template: getHeader() --><!-- /ko --> <!-- /ko --> </tr> </thead> @@ -21,9 +18,7 @@ <!-- ko foreach: { data: rows, as: 'row' } --> <tr data-part="body.row"> <!-- ko foreach: { data: $parent.elems, as: 'field' } --> - <!-- ko if: visible --> - <!-- ko template: getBody() --><!-- /ko --> - <!-- /ko --> + <!-- ko template: getBody() --><!-- /ko --> <!-- /ko --> </tr> <!-- /ko --> @@ -37,4 +32,5 @@ <!-- /ko --> </tbody> </table> + <!-- ko template: 'ui/grid/dnd/listing' --><!-- /ko --> </div> \ No newline at end of file diff --git a/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less b/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less index d3ef739a943..090fa854272 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less +++ b/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less @@ -48,6 +48,10 @@ @data-grid-row-parent-marker__size: 1rem; +@data-grid-td__dragging__opacity: 95%; +@data-grid-dragging-copy__border-color: @color-blue-pure; +@data-grid-dragging-copy__border: 1px solid @data-grid-dragging-copy__border-color; + // .admin__data-grid-outer-wrap { @@ -106,6 +110,9 @@ &:nth-child(even) { td { background-color: @data-grid-td__even__background-color; + &._dragging { + background-color: fade(@data-grid-td__even__background-color, @data-grid-td__dragging__opacity); + } } } &.data-grid-tr-no-data { @@ -154,6 +161,16 @@ &:last-child { border-right-style: @data-grid-td__border-outer-style; } + &._dragging { + color: fade(@table__color, @data-grid-td__dragging__opacity); + background-color: fade(@data-grid-td__odd__background-color, @data-grid-td__dragging__opacity); + a { + color: fade(@link__color, @data-grid-td__dragging__opacity); + &:hover { + color: fade(@link__hover__color, @data-grid-td__dragging__opacity); + } + } + } // Action select data grid styles (can be action-select-secondary in future) .action-select { .link-pattern(); @@ -189,11 +206,22 @@ &:first-child { border-left-color: @data-grid-th__border-color; } + &._dragover-left { + box-shadow: inset 3px 0 0px 0px @color-white; + } + &._dragover-right { + box-shadow: inset -3px 0 0px 0px @color-white; + } } .data-grid-th { color: @data-grid-th__color; padding: @data-grid-th__padding-vertical @data-grid-th__padding-horizontal; vertical-align: middle; + &._draggable { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } &._sortable { background-clip: padding-box; // Fix for border overlay in Firefox cursor: pointer; @@ -281,6 +309,45 @@ } } } + // Draggable columns + &._hidden { + display: none; + } + &.data-grid-draggable { + background-color: @color-black; + } + &._dragging-copy { + background-color: @color-white; + box-shadow: @component__box-shadow__base; + left: 0; + opacity: .95; + position: fixed; + top: 0; + z-index: @overlay__z-index; + .data-grid-th { + border: @data-grid-dragging-copy__border; + border-bottom: none; + } + .data-grid-th, + .data-grid-th._sortable { + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + tbody { + tr { + &:last-child { + td { + border-bottom: @data-grid-dragging-copy__border; + } + } + } + td { + border-left: @data-grid-dragging-copy__border; + border-right: @data-grid-dragging-copy__border; + } + } + } } // Ascend & Descend sort marker diff --git a/app/design/adminhtml/Magento/backend/web/css/source/_classes.less b/app/design/adminhtml/Magento/backend/web/css/source/_classes.less index 7562f5de527..ef23f9abd3a 100644 --- a/app/design/adminhtml/Magento/backend/web/css/source/_classes.less +++ b/app/design/adminhtml/Magento/backend/web/css/source/_classes.less @@ -19,3 +19,11 @@ .a-center { // ToDo UI: should be renamed to ._text-center text-align: center; } + +// No select +._no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} diff --git a/lib/web/mage/utils/arrays.js b/lib/web/mage/utils/arrays.js index 54fb9a6189a..71cdc5426dd 100644 --- a/lib/web/mage/utils/arrays.js +++ b/lib/web/mage/utils/arrays.js @@ -8,6 +8,18 @@ define([ ], function (_, utils) { 'use strict'; + function getIndex(elem, container) { + var index = container.indexOf(elem); + + if (~index) { + return index; + } + + return _.findIndex(container, function (item) { + return item && (item.name === elem || item === elem); + }); + } + return { /** * Facade method to remove/add value from/to array @@ -77,6 +89,48 @@ define([ return _.flatten(container); }, + insert: function (item, position, container) { + var currentIndex = getIndex(item, container), + newIndex, + target; + + if (typeof position === 'undefined') { + position = -1; + } else if (typeof position === 'string') { + position = isNaN(+position) ? position : +position; + } + + newIndex = position; + + if (~currentIndex) { + target = container.splice(currentIndex, 1)[0]; + + if (typeof item === 'string') { + item = target; + } + } + + if (typeof position !== 'number') { + target = position.after || position.before || position; + + newIndex = getIndex(target, container); + + if (~newIndex && (position.after || newIndex >= currentIndex)) { + newIndex++; + } + } + + if (newIndex < 0) { + newIndex += container.length + 1; + } + + container[newIndex] ? + container.splice(newIndex, 0, item) : + container[newIndex] = item; + + return !~currentIndex ? item : false; + }, + /** * Compares multiple arrays without tracking order of their elements. * @@ -93,7 +147,7 @@ define([ }); }, - formatOffset: function(elems, offset) { + formatOffset: function (elems, offset) { if (utils.isEmpty(offset)) { offset = -1; } diff --git a/lib/web/mage/utils/template.js b/lib/web/mage/utils/template.js index a2b8cd462f6..e330661e4bd 100644 --- a/lib/web/mage/utils/template.js +++ b/lib/web/mage/utils/template.js @@ -52,7 +52,9 @@ define([ tmplSettings.interpolate = interpolate; - tmpl = _.template(tmpl, {variable: '$'})(data); + tmpl = _.template(tmpl, { + variable: '$' + })(data); tmplSettings.interpolate = cached; @@ -63,7 +65,7 @@ define([ /** * Checks if provided value contains template syntax. * - * @param {*} value - Value to be check. + * @param {*} value - Value to be checked. * @returns {Boolean} */ function isTemplate(value) { @@ -114,6 +116,8 @@ define([ * var tmpl = { * key: {'${ $.$data.bar }': '${ $.$data.foo }'}, * foo: 'bar', + * x1: 2, x2: 5, + * delta: '${ $.x2 - $.x1 }', * baz: 'Upper ${ $.foo.toUpperCase() }' * }; * @@ -121,6 +125,8 @@ define([ * => { * key: {'Some': 'Random Stuff'}, * foo: 'bar', + * x1: 2, x2: 5, + * delta: 3, * baz: 'Upper BAR' * }; */ @@ -129,7 +135,7 @@ define([ return render(tmpl, data); } - tmpl = utils.extend({}, tmpl); + tmpl = utils.copy(tmpl); tmpl.$data = data || {}; @@ -147,7 +153,7 @@ define([ if (isTemplate(value)) { list[key] = render(value, tmpl); - } else if (_.isObject(value)) { + } else if (utils.isObject(value) || Array.isArray(value)) { _.each(value, iterate); } }); -- GitLab From d85246b80456c3cd3a8788e87dffd784ee34a893 Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Fri, 5 Jun 2015 19:56:37 +0300 Subject: [PATCH 075/396] MAGETWO-38254: Extend Ui/modal to support invoke without element --- .../Product/Helper/Form/Category.php | 2 +- .../adminhtml/web/js/new-category-dialog.js | 2 +- .../Ui/view/base/web/js/modal/confirm.js | 64 +++++++++++++++++++ .../Ui/view/base/web/js/modal/modalToggle.js | 28 ++++++++ lib/web/css/source/components/_modals.less | 12 ++++ 5 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 app/code/Magento/Ui/view/base/web/js/modal/confirm.js create mode 100644 app/code/Magento/Ui/view/base/web/js/modal/modalToggle.js diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Category.php b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Category.php index 54a51a1a551..ee730b9be81 100644 --- a/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Category.php +++ b/app/code/Magento/Catalog/Block/Adminhtml/Product/Helper/Form/Category.php @@ -132,7 +132,7 @@ class Category extends \Magento\Framework\Data\Form\Element\Multiselect 'id' => 'add_category_button', 'label' => $newCategoryCaption, 'title' => $newCategoryCaption, - 'onclick' => 'jQuery("#new-category").trigger("openModal")', + 'onclick' => 'jQuery("#new-category").modal("openModal")', 'disabled' => $this->getDisabled(), ] ); diff --git a/app/code/Magento/Catalog/view/adminhtml/web/js/new-category-dialog.js b/app/code/Magento/Catalog/view/adminhtml/web/js/new-category-dialog.js index 552e6a3a70e..d70f2e17193 100644 --- a/app/code/Magento/Catalog/view/adminhtml/web/js/new-category-dialog.js +++ b/app/code/Magento/Catalog/view/adminhtml/web/js/new-category-dialog.js @@ -111,7 +111,7 @@ define([ $('#new_category_name, #new_category_parent-suggest').val(''); $suggest.val(''); clearParentCategory(); - widget.element.trigger('closeModal'); + $(widget.element).modal('closeModal'); } else { $('#new_category_messages').html(data.messages); } diff --git a/app/code/Magento/Ui/view/base/web/js/modal/confirm.js b/app/code/Magento/Ui/view/base/web/js/modal/confirm.js new file mode 100644 index 00000000000..1769010d58b --- /dev/null +++ b/app/code/Magento/Ui/view/base/web/js/modal/confirm.js @@ -0,0 +1,64 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +define([ + 'jquery', + 'jquery/ui', + 'Magento_Ui/js/modal/modal', + 'mage/translate' +], function($) { + 'use strict'; + + $.widget('mage.confirm', $.mage.modal, { + options: { + modalClass: 'confirm', + actions: { + always: function(){}, + confirm: function(){}, + cancel: function(){} + }, + buttons: [{ + text: $.mage.__('No'), + class: 'action-tertiary', + click: function(){ + this.closeModal(); + } + },{ + text: $.mage.__('Yes'), + class: 'action-secondary', + click: function() { + this.closeModal(true); + } + }] + }, + _create: function() { + this._super(); + this.modal.find(this.options.modalCloseBtn).off().on('click', _.bind(this.closeModal, this, false)); + this.openModal(); + }, + _remove: function() { + this.modal.remove(); + }, + openModal: function() { + return this._super(); + }, + closeModal: function(result) { + result = result || false; + + if (result) { + this.options.actions.confirm(); + } else { + this.options.actions.cancel(); + } + this.options.actions.always(); + this.element.bind('confirmclosed', _.bind(this._remove, this)); + + return this._super(); + } + }); + + return function(config) { + return $('<div></div>').html(config.content).confirm(config); + }; +}); diff --git a/app/code/Magento/Ui/view/base/web/js/modal/modalToggle.js b/app/code/Magento/Ui/view/base/web/js/modal/modalToggle.js new file mode 100644 index 00000000000..65714ef029c --- /dev/null +++ b/app/code/Magento/Ui/view/base/web/js/modal/modalToggle.js @@ -0,0 +1,28 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +define([ + 'jquery', + 'Magento_Ui/js/modal/modal' +], function($){ + 'use strict'; + + return function(config, el) { + var widget = $(config.content).modal(config); + + $(el).on(config.toggleEvent, function() { + var state = widget.data('mage-modal').options.isOpen; + + if (state) { + widget.modal('closeModal'); + } else { + widget.modal('openModal'); + } + + return false; + }); + + return widget; + }; +}); \ No newline at end of file diff --git a/lib/web/css/source/components/_modals.less b/lib/web/css/source/components/_modals.less index c7776d6684e..2ded40e1cd6 100644 --- a/lib/web/css/source/components/_modals.less +++ b/lib/web/css/source/components/_modals.less @@ -28,6 +28,8 @@ @modal-slide-header__padding-vertical: 2.1rem; +@modal-popup-alert__width: 50rem; + // // Utilities // --------------------------------------------- @@ -181,6 +183,16 @@ padding-top: @modal-popup__padding; padding-bottom: @modal-popup__padding; } + &.confirm { + .modal-inner-wrap { + margin-left: -(@modal-popup-alert__width/2); + left: 50%; + width: @modal-popup-alert__width; + } + .modal-footer { + text-align: right; + } + } } // -- GitLab From 0489a1aa69469a85e69be8d44fbea38d11d4838d Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Mon, 8 Jun 2015 10:55:50 +0300 Subject: [PATCH 076/396] MAGETWO-38139: Implement extensible point in cart item action --- .../Magento/Checkout/Block/Cart/Item/Renderer/Actions.php | 2 ++ .../Checkout/Block/Cart/Item/Renderer/Actions/Generic.php | 2 ++ .../Unit/Block/Cart/Item/Renderer/Actions/GenericTest.php | 8 ++++---- .../Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php | 2 +- app/code/Magento/Checkout/composer.json | 1 - app/code/Magento/Downloadable/composer.json | 1 - 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php index ddd4d72ad20..e3d27d82677 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions.php @@ -30,10 +30,12 @@ class Actions extends Text * Set current quote item * * @param Item $item + * @return $this */ public function setItem(Item $item) { $this->item = $item; + return $this; } /** 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 index 556971a99af..6ce4f2eb87a 100644 --- a/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php +++ b/app/code/Magento/Checkout/Block/Cart/Item/Renderer/Actions/Generic.php @@ -29,10 +29,12 @@ class Generic extends Template * Set current quote item * * @param Item $item + * @return $this */ public function setItem(Item $item) { $this->item = $item; + return $this; } /** 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 index 3f229e7cc88..d6c6f0824c6 100644 --- 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 @@ -35,7 +35,7 @@ class GenericTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $this->model->setItem($itemMock); + $this->assertEquals($this->model, $this->model->setItem($itemMock)); $this->assertEquals($itemMock, $this->model->getItem()); } @@ -49,7 +49,7 @@ class GenericTest extends \PHPUnit_Framework_TestCase ->getMock(); /** - * @var Product|\PHPUnit_Framework_MockObject_MockObject $itemMock + * @var Product|\PHPUnit_Framework_MockObject_MockObject $productMock */ $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') ->disableOriginalConstructor() @@ -63,7 +63,7 @@ class GenericTest extends \PHPUnit_Framework_TestCase ->method('isVisibleInSiteVisibility') ->willReturn(true); - $this->model->setItem($itemMock); + $this->assertEquals($this->model, $this->model->setItem($itemMock)); $this->assertTrue($this->model->isProductVisibleInSiteVisibility()); } @@ -81,7 +81,7 @@ class GenericTest extends \PHPUnit_Framework_TestCase ->method('getIsVirtual') ->willReturn(true); - $this->model->setItem($itemMock); + $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/ActionsTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/Item/Renderer/ActionsTest.php index 1c4c49a1f5b..514648f0a8c 100644 --- 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 @@ -54,7 +54,7 @@ class ActionsTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $this->model->setItem($itemMock); + $this->assertEquals($this->model, $this->model->setItem($itemMock)); $this->assertEquals($itemMock, $this->model->getItem()); } diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json index ba0fac8c01e..9bc107af606 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-beta10", "magento/module-eav": "0.74.0-beta10", "magento/module-gift-message": "0.74.0-beta10", - "magento/module-wishlist": "0.74.0-beta10", "magento/module-page-cache": "0.74.0-beta10", "magento/module-theme": "0.74.0-beta10", "magento/module-msrp": "0.74.0-beta10", diff --git a/app/code/Magento/Downloadable/composer.json b/app/code/Magento/Downloadable/composer.json index 16adcb3869b..520b9b33fbc 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-beta10", "magento/module-checkout": "0.74.0-beta10", "magento/module-directory": "0.74.0-beta10", - "magento/module-wishlist": "0.74.0-beta10", "magento/module-gift-message": "0.74.0-beta10", "magento/module-catalog-inventory": "0.74.0-beta10", "magento/module-msrp": "0.74.0-beta10", -- GitLab From 5c9cc86047bbfaec79612da58d09d04841e25872 Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Mon, 8 Jun 2015 12:22:51 +0300 Subject: [PATCH 077/396] MAGETWO-38139: Implement extensible point in cart item action --- .../Test/Unit/Block/Cart/Item/Renderer/ConfigurableTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8594a0fb07f..23f9b9b8ff1 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(); -- GitLab From 0e5566a908d4f221bd987c4265f9044ad19568b7 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Mon, 8 Jun 2015 12:39:44 +0300 Subject: [PATCH 078/396] MAGETWO-38155: Create block for order level --- .../GiftMessage/Block/Cart/GiftOptions.php | 6 +-- .../Model/CompositeConfigProvider.php | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php diff --git a/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php index 78641a6468b..bf208eb18ea 100644 --- a/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php +++ b/app/code/Magento/GiftMessage/Block/Cart/GiftOptions.php @@ -5,9 +5,9 @@ */ namespace Magento\GiftMessage\Block\Cart; -use \Magento\Backend\Block\Template\Context; -use \Magento\Framework\Json\Encoder; -use \Magento\Checkout\Model\CompositeConfigProvider; +use Magento\Backend\Block\Template\Context; +use Magento\Framework\Json\Encoder; +use Magento\GiftMessage\Model\CompositeConfigProvider; class GiftOptions extends \Magento\Backend\Block\Template { diff --git a/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php b/app/code/Magento/GiftMessage/Model/CompositeConfigProvider.php new file mode 100644 index 00000000000..49fe4c189b1 --- /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; + } +} -- GitLab From e106bcfd89d6f902d69f285a746a940f4868f6b1 Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Mon, 8 Jun 2015 13:54:16 +0300 Subject: [PATCH 079/396] MAGETWO-38139: Implement extensible point in cart item action --- .../Magento/Checkout/Block/Cart/Item/RendererTest.php | 6 ------ 1 file changed, 6 deletions(-) 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 a6957a03133..08220dd340a 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 * -- GitLab From 511fa752245d357893b6ea5a3466f2e38593205d Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Mon, 8 Jun 2015 14:51:47 +0300 Subject: [PATCH 080/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- app/code/Magento/Catalog/Setup/InstallSchema.php | 2 +- .../product/composite/fieldset/options/type/date.phtml | 2 +- app/code/Magento/CatalogImportExport/Model/Import/Product.php | 4 ++-- .../Block/Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php | 2 +- .../CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php | 2 +- .../Checkout/view/frontend/web/js/opc-shipping-method.js | 2 +- app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js | 2 +- .../Checkout/view/frontend/web/template/authentication.html | 4 ++-- .../Config/Controller/Adminhtml/System/Config/Save.php | 2 +- .../configurable/affected-attribute-set-selector/form.phtml | 2 +- app/code/Magento/Customer/Controller/Account/CreatePost.php | 4 ++-- app/code/Magento/Customer/Controller/Account/LoginPost.php | 2 +- .../Magento/Customer/Controller/Account/ResetPasswordPost.php | 2 +- .../Magento/Customer/view/email/account_new_confirmed.html | 2 +- app/code/Magento/Email/Setup/InstallSchema.php | 2 +- .../Email/view/adminhtml/templates/template/edit.phtml | 2 +- .../Controller/Adminhtml/Googleshopping/Items/Refresh.php | 2 +- app/code/Magento/Newsletter/Setup/InstallSchema.php | 4 ++-- app/code/Magento/Sales/Model/AdminOrder/Create.php | 2 +- .../SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php | 2 +- .../Wishlist/Test/Block/Customer/Wishlist/Items/Product.php | 2 +- .../Test/Constraint/AbstractAssertWishlistProductDetails.php | 2 +- .../Test/Constraint/AssertProductDetailsInWishlist.php | 4 ++-- lib/web/mage/validation.js | 2 +- 24 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/code/Magento/Catalog/Setup/InstallSchema.php b/app/code/Magento/Catalog/Setup/InstallSchema.php index d1eb9d29ad5..2193120073f 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'], - 'Product Template Id' + 'Product Template ID' ) ->addColumn( 'type_id', 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 31bc0c8da1b..53ffa3fca77 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( __('The field is not complete.') )?>'); + }, '<?php echo $block->escapeJsQuote( __('The field isn\'t complete.') )?>'); <?php endif; ?> //]]> diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index 5a502d722f3..90c42ef9e26 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -109,8 +109,8 @@ 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 Product Template 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 => 'Please make sure attribute "%s" is not empty.', 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 a0ac81cb1af..604bef2389d 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 (do not add conditions if rule applies to all products))')] + ['legend' => __('Conditions (don\'t add conditions if rule applies to all products))')] )->setRenderer( $renderer ); 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 c24d1743e48..53eb1d2f851 100644 --- a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php +++ b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog/Delete.php @@ -30,7 +30,7 @@ class Delete extends \Magento\CatalogRule\Controller\Adminhtml\Promo\Catalog $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addError( - __('Something went wrong while deleting the rule. Please check the log and try again.') + __('Something went wrong while deleting the rule. Please review the log file for details.') ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $this->_redirect('catalog_rule/*/edit', ['id' => $this->getRequest()->getParam('id')]); diff --git a/app/code/Magento/Checkout/view/frontend/web/js/opc-shipping-method.js b/app/code/Magento/Checkout/view/frontend/web/js/opc-shipping-method.js index 1fab57f3c10..0e7d442ce82 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/opc-shipping-method.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/opc-shipping-method.js @@ -63,7 +63,7 @@ define([ _validateShippingMethod: function() { var methods = this.element.find('[name="shipping_method"]'); if (methods.length === 0) { - alert($.mage.__('We can\'t ship to this address. Please choose another address or edit the current address.')); + alert($.mage.__('We can\'t ship to this address. Please choose another address or edit the current one.')); return false; } if (methods.filter(':checked').length) { 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 3f0274d551b..5e8a2b42eec 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/opcheckout.js @@ -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 choose another address or edit the current address.')); + alert($.mage.__('We can\'t ship to this address. Please choose another address or edit the current one.')); return false; } 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 441aeab4715..263249c0382 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/authentication.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/authentication.html @@ -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('Create an Account')"></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('Create an Account')"></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> 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 51e7cbab93d..75b8eb4fd26 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, - __('ASomething went wrong while saving this configuration:') . ' ' . $e->getMessage() + __('Something went wrong while saving this configuration:') . ' ' . $e->getMessage() ); } 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 65f7e2df168..79fda9e439b 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 __("product template 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> diff --git a/app/code/Magento/Customer/Controller/Account/CreatePost.php b/app/code/Magento/Customer/Controller/Account/CreatePost.php index e8815cbe722..f2f4fc6a687 100644 --- a/app/code/Magento/Customer/Controller/Account/CreatePost.php +++ b/app/code/Magento/Customer/Controller/Account/CreatePost.php @@ -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 your 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 your 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/LoginPost.php b/app/code/Magento/Customer/Controller/Account/LoginPost.php index 1025a1e801a..f6bc66ab48e 100644 --- a/app/code/Magento/Customer/Controller/Account/LoginPost.php +++ b/app/code/Magento/Customer/Controller/Account/LoginPost.php @@ -102,7 +102,7 @@ class LoginPost extends \Magento\Customer\Controller\Account $this->messageManager->addError(__('Something went wrong validating the login and password.')); } } else { - $this->messageManager->addError(__('A 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 f76e619001f..98abee21af3 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(__('Please enter new password.')); + $this->messageManager->addError(__('Please enter a new password.')); $resultRedirect->setPath('*/*/createPassword', ['id' => $customerId, 'token' => $resetPasswordToken]); return $resultRedirect; } 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 6d726f9e74c..094102911e6 100644 --- a/app/code/Magento/Customer/view/email/account_new_confirmed.html +++ b/app/code/Magento/Customer/view/email/account_new_confirmed.html @@ -33,7 +33,7 @@ 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 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 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;">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 e-mail 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> diff --git a/app/code/Magento/Email/Setup/InstallSchema.php b/app/code/Magento/Email/Setup/InstallSchema.php index 4b349973479..05931d61056 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/view/adminhtml/templates/template/edit.phtml b/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml index 9c2fa323140..96b6789adca 100644 --- a/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml +++ b/app/code/Magento/Email/view/adminhtml/templates/template/edit.phtml @@ -205,7 +205,7 @@ require([ } }.bind(this)); } else { - alert('<?php echo __('The template did not load. Check the 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/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php index 4219dfaa500..bd3cc24f21b 100644 --- a/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php +++ b/app/code/Magento/GoogleShopping/Controller/Adminhtml/Googleshopping/Items/Refresh.php @@ -52,7 +52,7 @@ class Refresh extends \Magento\GoogleShopping\Controller\Adminhtml\Googleshoppin $this->notifier->addMajor( __('Something went wrong while deleting products from the Google shopping account.'), __( - 'One or more products were not deleted from the Google shopping account. Check 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/Newsletter/Setup/InstallSchema.php b/app/code/Magento/Newsletter/Setup/InstallSchema.php index f567558d055..85a6f6a249f 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/Sales/Model/AdminOrder/Create.php b/app/code/Magento/Sales/Model/AdminOrder/Create.php index e6f2a0a1052..80210cb7bd7 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 can't find this wish list.") + __('We can\'t find this wish list.') ); } $wishlist->setStore( 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 de5b18e8c15..9197a7127b8 100644 --- a/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php +++ b/app/code/Magento/SalesRule/Controller/Adminhtml/Promo/Quote/Delete.php @@ -28,7 +28,7 @@ class Delete extends \Magento\SalesRule\Controller\Adminhtml\Promo\Quote $this->messageManager->addError($e->getMessage()); } catch (\Exception $e) { $this->messageManager->addError( - __('Something went wrong while deleting the rule. Please check the log and try again.') + __('Something went wrong while deleting the rule. Please review the log file for details.') ); $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e); $this->_redirect('sales_rule/*/edit', ['id' => $this->getRequest()->getParam('id')]); 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 b883caecd3a..49897e480fa 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"]'; /** - * Locator value for "See Details" tool tip. + * 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 26d9c424c08..758fb0cee41 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 "See 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 afb1cce8871..635f1c68410 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 "See 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 "See 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/lib/web/mage/validation.js b/lib/web/mage/validation.js index ccc2ade46fe..10920e9edef 100644 --- a/lib/web/mage/validation.js +++ b/lib/web/mage/validation.js @@ -901,7 +901,7 @@ } return hasWithValue ^ hasWithNoValue; }, - 'The field is not complete.' + 'The field isn\'t complete.' ], "validate-required-datetime": [ function(v, elm, param) { -- GitLab From 2c1d6a3865fc220290217160343fb4731398cb88 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Mon, 8 Jun 2015 18:00:24 +0300 Subject: [PATCH 081/396] MAGETWO-38156: Move gift message to cart --- .../Block/Cart/Item/Renderer/Actions/GiftOptions.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 index 515a4c8cc0e..429279e7ff2 100644 --- a/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php +++ b/app/code/Magento/GiftMessage/Block/Cart/Item/Renderer/Actions/GiftOptions.php @@ -57,9 +57,10 @@ class GiftOptions extends Generic */ public function getJsLayout() { + $jsLayout = $this->jsLayout; foreach ($this->layoutProcessors as $processor) { - $this->jsLayout = $processor->process($this->jsLayout, $this->getItem()); + $jsLayout = $processor->process($jsLayout, $this->getItem()); } - return $this->jsonEncoder->encode($this->jsLayout); + return $this->jsonEncoder->encode($jsLayout); } } -- GitLab From 8c1618874c45f6e9d72e973610ffd01d65508cd2 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Mon, 8 Jun 2015 19:09:23 +0300 Subject: [PATCH 082/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../Test/Unit/Model/System/Message/SecurityTest.php | 2 +- .../Magento/Authorization/Model/Acl/AclRetriever.php | 2 +- .../Backup/Controller/Adminhtml/Index/Create.php | 2 +- .../Backup/Controller/Adminhtml/Index/Rollback.php | 2 +- app/code/Magento/Backup/Model/Backup.php | 2 +- .../Catalog/Controller/Adminhtml/Category/Save.php | 2 +- .../Controller/Adminhtml/Product/Attribute/Save.php | 2 +- app/code/Magento/Catalog/Model/Product/Website.php | 4 ++-- .../Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php | 2 +- .../Checkout/Controller/Onepage/SaveOrder.php | 2 +- .../Sales/Order/Address/Form/Renderer/Vat.php | 2 +- .../Magento/Customer/Controller/Account/EditPost.php | 2 +- .../Customer/Controller/Account/LoginPost.php | 4 +++- .../Controller/Account/ResetPasswordPost.php | 2 +- app/code/Magento/Customer/Controller/Ajax/Login.php | 2 +- .../CustomerImportExport/Model/Import/Customer.php | 2 +- .../Design/Editor/Tools/RemoveQuickStyleImage.php | 2 +- .../System/Design/Editor/Tools/RemoveStoreLogo.php | 2 +- .../System/Design/Editor/Tools/SaveQuickStyles.php | 2 +- .../Design/Editor/Tools/UploadQuickStyleImage.php | 2 +- .../System/Design/Editor/Tools/UploadStoreLogo.php | 2 +- .../Controller/Adminhtml/Import/Validate.php | 10 +++++----- app/code/Magento/ImportExport/Model/Import.php | 6 +++--- .../Controller/Adminhtml/Indexer/MassChangelog.php | 2 +- .../Integration/Model/AuthorizationService.php | 3 ++- .../view/frontend/templates/checkout/addresses.phtml | 2 +- .../view/frontend/templates/checkout/link.phtml | 2 +- app/code/Magento/SendFriend/composer.json | 12 ++++++------ .../Catalog/Controller/Adminhtml/CategoryTest.php | 2 +- .../Magento/Customer/Controller/AccountTest.php | 6 +++--- .../Magento/Framework/Filesystem/Driver/Http.php | 2 +- .../Magento/Framework/Model/AbstractModel.php | 2 +- 32 files changed, 49 insertions(+), 46 deletions(-) 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 9e1937dae50..b4c8c3c6fb2 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 set up 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 615f75bda4d..b9ace243555 100644 --- a/app/code/Magento/Authorization/Model/Acl/AclRetriever.php +++ b/app/code/Magento/Authorization/Model/Acl/AclRetriever.php @@ -86,7 +86,7 @@ class AclRetriever $this->logger->critical($e); throw new LocalizedException( __( - 'Something went wrong compiling a list of allowed resources. ' + 'Something went wrong while compiling a list of allowed resources. ' . 'You can find out more in the exceptions log.' ) ); diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php index 35112845bcb..abe181923ca 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Create.php @@ -65,7 +65,7 @@ class Create extends \Magento\Backup\Controller\Adminhtml\Index ) ); $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()); } diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php index 438213b0dfb..ccc74f6d9ef 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Rollback.php @@ -89,7 +89,7 @@ class Rollback extends \Magento\Backup\Controller\Adminhtml\Index ) ); $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()); } diff --git a/app/code/Magento/Backup/Model/Backup.php b/app/code/Magento/Backup/Model/Backup.php index a19cf709190..0994b903703 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/Catalog/Controller/Adminhtml/Category/Save.php b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php index 1b01c24624e..310c50fb932 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php @@ -163,7 +163,7 @@ 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( - __('Something went wrong saving the category.') + __('Something went wrong while saving the category.') ); } 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 4ad5a280d4a..2af5e4358e2 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php @@ -112,7 +112,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute } 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.')); } } diff --git a/app/code/Magento/Catalog/Model/Product/Website.php b/app/code/Magento/Catalog/Model/Product/Website.php index 0a389baf909..8df811f7dba 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/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php b/app/code/Magento/CatalogRule/Block/Adminhtml/Promo/Catalog/Edit/Tab/Conditions.php index 604bef2389d..e52687c42cf 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 (don\'t add conditions if rule applies to all products))')] + ['legend' => __('Conditions (don\'t add conditions if rule is applied to all products)')] )->setRenderer( $renderer ); diff --git a/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php b/app/code/Magento/Checkout/Controller/Onepage/SaveOrder.php index 205174f25e2..6ded4bb2323 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/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 14bb0596ffd..211b310cb7a 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 @@ -85,7 +85,7 @@ class Vat extends \Magento\Backend\Block\Widget\Form\Renderer\Fieldset\Element 'Based on the VAT ID, the customer belongs to the Customer Group %s.' ) . "\n" . $groupMessage, 'vatValidationFailedMessage' => __( - 'Something went wrong 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/EditPost.php b/app/code/Magento/Customer/Controller/Account/EditPost.php index cd3923725c2..e56a0f5d594 100644 --- a/app/code/Magento/Customer/Controller/Account/EditPost.php +++ b/app/code/Magento/Customer/Controller/Account/EditPost.php @@ -97,7 +97,7 @@ class EditPost extends \Magento\Customer\Controller\Account } catch (\Exception $e) { $this->messageManager->addException( $e, - __('Something went wrong changing the password.') + __('Something went wrong while changing the password.') ); } } else { diff --git a/app/code/Magento/Customer/Controller/Account/LoginPost.php b/app/code/Magento/Customer/Controller/Account/LoginPost.php index f6bc66ab48e..a89e64718ff 100644 --- a/app/code/Magento/Customer/Controller/Account/LoginPost.php +++ b/app/code/Magento/Customer/Controller/Account/LoginPost.php @@ -99,7 +99,9 @@ class LoginPost extends \Magento\Customer\Controller\Account $this->messageManager->addError($message); $this->_getSession()->setUsername($login['username']); } catch (\Exception $e) { - $this->messageManager->addError(__('Something went wrong validating the login and password.')); + $this->messageManager->addError( + __('Something went wrong while validating the login and password.') + ); } } else { $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 98abee21af3..08c8f70675d 100644 --- a/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php +++ b/app/code/Magento/Customer/Controller/Account/ResetPasswordPost.php @@ -73,7 +73,7 @@ class ResetPasswordPost extends \Magento\Customer\Controller\Account $resultRedirect->setPath('*/*/login'); return $resultRedirect; } catch (\Exception $exception) { - $this->messageManager->addError(__('Something went wrong 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/Ajax/Login.php b/app/code/Magento/Customer/Controller/Ajax/Login.php index 0313e4456a9..8491d5b08e4 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' => __('Something went wrong validating the login 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/CustomerImportExport/Model/Import/Customer.php b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php index 5fbe559b5c0..6228384d8f0 100644 --- a/app/code/Magento/CustomerImportExport/Model/Import/Customer.php +++ b/app/code/Magento/CustomerImportExport/Model/Import/Customer.php @@ -190,7 +190,7 @@ class Customer extends AbstractCustomer ); $this->addMessageTemplate( self::ERROR_EMAIL_SITE_NOT_FOUND, - __('We can\'t find that mail and website combination.') + __('We can\'t find that email and website combination.') ); $this->addMessageTemplate(self::ERROR_PASSWORD_LENGTH, __('Please enter a password with a valid length.')); 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 7f30a689d55..d45e6905fa0 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 3911e9a51b5..26645878c0f 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/SaveQuickStyles.php b/app/code/Magento/DesignEditor/Controller/Adminhtml/System/Design/Editor/Tools/SaveQuickStyles.php index 7f0b66fd15d..b2bc0a54afe 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 d77ad32b12a..8ab88dda212 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 e2e962e721c..224dcb4185f 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/ImportExport/Controller/Adminhtml/Import/Validate.php b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php index cec1afd5fe1..02251122f81 100644 --- a/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php +++ b/app/code/Magento/ImportExport/Controller/Adminhtml/Import/Validate.php @@ -26,11 +26,11 @@ class Validate extends ImportController ImportResultBlock $resultBlock ) { if ($import->getProcessedRowsCount() == $import->getInvalidRowsCount()) { - $resultBlock->addNotice(__('This file is invalid. Please fix any errors and re-upload the file.')); + $resultBlock->addNotice(__('This file is invalid. Please fix errors and re-upload the file.')); } elseif ($import->getErrorsCount() >= $import->getErrorsLimit()) { $resultBlock->addNotice( __( - 'You\'ve reached an error limit (%1). Please fix any errors and re-upload the file.', + 'You\'ve reached an error limit (%1). Please fix errors and re-upload the file.', $import->getErrorsLimit() ) ); @@ -38,7 +38,7 @@ class Validate extends ImportController if ($import->isImportAllowed()) { $resultBlock->addNotice( __( - 'Please fix any errors and re-upload the file. Or press "Import" to skip rows with errors.' + 'Please fix errors and re-upload the file. Or press "Import" to skip rows with errors.' ), true ); @@ -86,7 +86,7 @@ class Validate extends ImportController $validationResult = $import->validateSource($source); if (!$import->getProcessedRowsCount()) { - $resultBlock->addError(__('This file is empty. Please try another.')); + $resultBlock->addError(__('This file is empty. Please try another one.')); } else { if (!$validationResult) { $this->processValidationError($import, $resultBlock); @@ -115,7 +115,7 @@ class Validate extends ImportController ); } } catch (\Exception $e) { - $resultBlock->addNotice(__('Please fix any errors and re-upload the file.')) + $resultBlock->addNotice(__('Please fix errors and re-upload the file.')) ->addError($e->getMessage()); } return $resultLayout; diff --git a/app/code/Magento/ImportExport/Model/Import.php b/app/code/Magento/ImportExport/Model/Import.php index a2997ee9be3..cf68537c8ec 100644 --- a/app/code/Magento/ImportExport/Model/Import.php +++ b/app/code/Magento/ImportExport/Model/Import.php @@ -231,15 +231,15 @@ class Import extends \Magento\ImportExport\Model\AbstractModel if ($this->getProcessedRowsCount()) { if (!$validationResult) { if ($this->getProcessedRowsCount() == $this->getInvalidRowsCount()) { - $messages[] = __('This file is invalid. Please fix any errors and re-upload the file.'); + $messages[] = __('This file is invalid. Please fix errors and re-upload the file.'); } elseif ($this->getErrorsCount() >= $this->getErrorsLimit()) { $messages[] = __( - 'You\'ve reached an error limit (%1). Please fix any errors and re-upload the 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 any errors and re-upload the file.'); + $messages[] = __('Please fix errors and re-upload the file.'); } else { $messages[] = __('The file is partially valid, but we can\'t import it for some reason.'); } diff --git a/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php b/app/code/Magento/Indexer/Controller/Adminhtml/Indexer/MassChangelog.php index ba142fbb2f3..e39cc3cc5fa 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( - __('%1 indexer(s) are in Update by Schedule mode.', 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/Integration/Model/AuthorizationService.php b/app/code/Magento/Integration/Model/AuthorizationService.php index 5353338a59e..983bb26be20 100644 --- a/app/code/Magento/Integration/Model/AuthorizationService.php +++ b/app/code/Magento/Integration/Model/AuthorizationService.php @@ -127,7 +127,8 @@ class AuthorizationService implements \Magento\Integration\Api\AuthorizationServ } catch (\Exception $e) { $this->_logger->critical($e); throw new LocalizedException( - __('Something went wrong deleting roles and permissions. You can find out more in the exceptions log.') + __('Something went wrong while deleting roles and permissions.' + . ' You can find out more in the exceptions log.') ); } } 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 a1005f26b01..f1085b397ee 100644 --- a/app/code/Magento/Multishipping/view/frontend/templates/checkout/addresses.phtml +++ b/app/code/Magento/Multishipping/view/frontend/templates/checkout/addresses.phtml @@ -73,7 +73,7 @@ </div> <div class="actions-toolbar"> <div class="primary"> - <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 __('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/link.phtml b/app/code/Magento/Multishipping/view/frontend/templates/checkout/link.phtml index 505d2451abb..7af7299bc13 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 __('Check Out 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/SendFriend/composer.json b/app/code/Magento/SendFriend/composer.json index 7ef783b540c..20c2b6321fb 100644 --- a/app/code/Magento/SendFriend/composer.json +++ b/app/code/Magento/SendFriend/composer.json @@ -1,13 +1,13 @@ { - "name": "magento/module-search", + "name": "magento/module-send-friend", "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta11", - "magento/module-backend": "0.74.0-beta11", - "magento/module-catalog-search": "0.74.0-beta11", "magento/module-store": "0.74.0-beta11", - "magento/module-reports": "0.74.0-beta11", + "magento/module-catalog": "0.74.0-beta11", + "magento/module-customer": "0.74.0-beta11", + "magento/module-theme": "0.74.0-beta11", + "magento/framework": "0.74.0-beta11", "magento/magento-composer-installer": "*" }, "type": "magento2-module", @@ -20,7 +20,7 @@ "map": [ [ "*", - "Magento/Search" + "Magento/SendFriend" ] ] } 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 6f4ab16528d..02ba93db4c6 100644 --- a/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php +++ b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php @@ -333,7 +333,7 @@ class CategoryTest extends \Magento\Backend\Utility\Controller ); $this->dispatch('backend/catalog/category/save'); $this->assertSessionMessages( - $this->equalTo(['Something went wrong saving 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/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index 9f61e8db5b6..89836b613ad 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -196,7 +196,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->equalTo([ 'You must confirm your account. Please check your e-mail for the confirmation link or ' . '<a href="http://localhost/index.php/customer/account/confirmation/email/' - . $email . '/">click here</a> for a new link.', + . $email . '/">click here</a> for a new link.' ]), MessageInterface::TYPE_SUCCESS ); @@ -319,7 +319,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/account/')); $this->assertSessionMessages( $this->equalTo([ - 'We\'ll email you a link to reset your password.', + 'We\'ll email you a link to reset your password.' ]), MessageInterface::TYPE_SUCCESS ); @@ -356,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(['Something went wrong saving the new password.']), + $this->equalTo(['Something went wrong while saving the new password.']), MessageInterface::TYPE_ERROR ); } diff --git a/lib/internal/Magento/Framework/Filesystem/Driver/Http.php b/lib/internal/Magento/Framework/Filesystem/Driver/Http.php index 2e60f74c6f1..89bce570696 100644 --- a/lib/internal/Magento/Framework/Filesystem/Driver/Http.php +++ b/lib/internal/Magento/Framework/Filesystem/Driver/Http.php @@ -243,7 +243,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 a686950cb8d..5cd8b036135 100644 --- a/lib/internal/Magento/Framework/Model/AbstractModel.php +++ b/lib/internal/Magento/Framework/Model/AbstractModel.php @@ -243,7 +243,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('the resource is not set.') + new \Magento\Framework\Phrase('Rhe resource isn\'t set.') ); } -- GitLab From 80ab0080f1b134c9a87e5ce37c89b5024c4c1a95 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Mon, 8 Jun 2015 19:47:25 +0300 Subject: [PATCH 083/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- app/code/Magento/Integration/Model/AuthorizationService.php | 6 ++++-- lib/internal/Magento/Framework/Model/AbstractModel.php | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Integration/Model/AuthorizationService.php b/app/code/Magento/Integration/Model/AuthorizationService.php index 983bb26be20..58e9f87a3d1 100644 --- a/app/code/Magento/Integration/Model/AuthorizationService.php +++ b/app/code/Magento/Integration/Model/AuthorizationService.php @@ -127,8 +127,10 @@ class AuthorizationService implements \Magento\Integration\Api\AuthorizationServ } catch (\Exception $e) { $this->_logger->critical($e); throw new LocalizedException( - __('Something went wrong while deleting roles and permissions.' - . ' You can find out more in the exceptions log.') + __( + 'Something went wrong while deleting roles and permissions.' + . ' You can find out more in the exceptions log.' + ) ); } } diff --git a/lib/internal/Magento/Framework/Model/AbstractModel.php b/lib/internal/Magento/Framework/Model/AbstractModel.php index 5cd8b036135..a5605dcc1ba 100644 --- a/lib/internal/Magento/Framework/Model/AbstractModel.php +++ b/lib/internal/Magento/Framework/Model/AbstractModel.php @@ -243,7 +243,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('Rhe resource isn\'t set.') + new \Magento\Framework\Phrase('The resource isn\'t set.') ); } -- GitLab From 7cb9360664e7411fda886ce0f0f9eb321f88a999 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 8 Jun 2015 20:13:46 +0300 Subject: [PATCH 084/396] MAGETWO-38264: Change d'n'd widget initialization --- .../ui_component/cms_page_listing.xml | 6 +- .../view/base/web/js/grid/columns/actions.js | 1 - .../view/base/web/js/grid/columns/column.js | 30 ++++- .../Magento/Ui/view/base/web/js/grid/dnd.js | 112 +++++++++++------- .../Ui/view/base/web/js/grid/listing.js | 41 ++++++- .../base/web/js/lib/ko/bind/after-render.js | 19 +++ .../Ui/view/base/web/js/lib/ko/bind/dnd.js | 25 ---- .../Ui/view/base/web/js/lib/ko/initialize.js | 5 +- .../base/web/templates/grid/cells/html.html | 8 +- .../web/templates/grid/cells/multiselect.html | 9 +- .../base/web/templates/grid/cells/text.html | 9 +- .../web/templates/grid/columns/actions.html | 10 -- .../base/web/templates/grid/columns/text.html | 6 +- .../base/web/templates/grid/dnd/listing.html | 6 +- .../view/base/web/templates/grid/listing.html | 14 ++- 15 files changed, 196 insertions(+), 105 deletions(-) create mode 100644 app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js delete mode 100644 app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js delete mode 100644 app/code/Magento/Ui/view/base/web/templates/grid/columns/actions.html diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml index a1f9c8c1b61..2d4c06bdbc9 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml @@ -322,6 +322,7 @@ <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/multiselect</item> </item> <item name="config" xsi:type="array"> + <item name="draggable" xsi:type="boolean">false</item> <item name="indexField" xsi:type="string">page_id</item> <item name="controlVisibility" xsi:type="boolean">false</item> </item> @@ -487,7 +488,7 @@ <column name="meta_keywords"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> @@ -500,7 +501,7 @@ <column name="meta_description"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> - <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/sortable</item> + <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> </item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> @@ -513,6 +514,7 @@ <column name="actions" class="Magento\Cms\Ui\Component\Listing\Column\PageActions"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="draggable" xsi:type="boolean">false</item> <item name="dataType" xsi:type="string">actions</item> <item name="align" xsi:type="string">left</item> <item name="label" xsi:type="string" translate="true">Action</item> diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js index 33a095e64e8..04c9a97c8a8 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js @@ -10,7 +10,6 @@ define([ return Column.extend({ defaults: { - headerTmpl: 'ui/grid/columns/actions', bodyTmpl: 'ui/grid/cells/actions' }, diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js index 85f55771ae9..901bb6c6c46 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js @@ -16,6 +16,7 @@ define([ sortable: true, sorting: false, visible: true, + draggable: true, dragging: false, dragover: false, links: { @@ -64,22 +65,40 @@ define([ } }, - sort: function (enabled) { + /** + * Sets columns' sorting. If column is currently sorted, + * than its' direction will be toggled. + * + * @param {*} [enable=true] - If false, than sorting will + * be removed from a column. + * @returns {Column} Chainable. + */ + sort: function (enable) { var direction; if (!this.sortable) { - return; + return this; } - direction = enabled !== false ? + enable = enable !== false ? true : false; + + direction = enable ? this.sorting() ? this.toggleDirection() : 'asc' : false; this.sorting(direction); + + return this; }, + /** + * Exports sorting data to the dataProvider if + * sorting of a column is enabled. + * + * @param {(String|Boolean)} sorting - Columns' sorting state. + */ exportSorting: function (sorting) { if (!sorting) { return; @@ -91,6 +110,11 @@ define([ }); }, + /** + * Toggles sorting direcction. + * + * @returns {String} + */ toggleDirection: function () { return this.sorting() === 'asc' ? 'desc' : diff --git a/app/code/Magento/Ui/view/base/web/js/grid/dnd.js b/app/code/Magento/Ui/view/base/web/js/grid/dnd.js index 3887a158337..383c50e031d 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/dnd.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/dnd.js @@ -14,7 +14,9 @@ define([ transformProp; /** - * Defines vendor prefix for the css 'transform' property. + * Defines supported css 'transform' property. + * + * @returns {String|Undefined} */ transformProp = (function () { var style = document.body.style, @@ -23,14 +25,14 @@ define([ vi = vendors.length, property; - if (typeof style.transform !== 'undefined') { + if (typeof style.transform != 'undefined') { return 'transform'; } while (vi--) { property = vendors[vi] + base; - if (typeof style[property] !== 'undefined') { + if (typeof style[property] != 'undefined') { return property; } } @@ -39,6 +41,7 @@ define([ /** * Returns first touch data if it's available. * + * @param {(MouseEvent|TouchEvent)} e - Event object. * @returns {Object} */ function getTouch(e) { @@ -58,6 +61,7 @@ define([ elem.style[transformProp] = value; } + /*eslint-disable no-extra-parens*/ /** * Checks if specified coordinate is inside of the provided area. * @@ -73,6 +77,7 @@ define([ y >= area.top && y <= area.bottom ); } + /*eslint-enable no-extra-parens*/ /** * Calculates distance between two points. @@ -105,13 +110,12 @@ define([ return Class.extend({ defaults: { - columnsSelector: '', - dragGridSelector: '', noSelectClass: '_no-select', hiddenClass: '_hidden', fixedX: false, fixedY: true, - minDistance: 2 + minDistance: 2, + columns: [] }, /** @@ -122,49 +126,66 @@ define([ initialize: function () { _.bindAll(this, 'onMouseMove', 'onMouseUp', 'onMouseDown'); + this.$body = $('body'); + this._super() - .initColumns() .initListeners(); return this; }, /** - * Searches document for the columns elements. + * Binds necessary events listeners. * - * @returns {Dnd} Chainable. + * @returns {Dnd} Chainbale. */ - initColumns: function () { - var columns = this.grid.querySelectorAll(this.columnsSelector); - - this.$body = $('body'); + initListeners: function () { + var addListener = document.addEventListener; - this.dragGrid = document.querySelector(this.dragGridSelector); - this.columns = _.toArray(columns); + if (isTouchDevice) { + addListener('touchmove', this.onMouseMove, false); + addListener('touchend', this.onMouseUp, false); + addListener('touchleave', this.onMouseUp, false); + } else { + addListener('mousemove', this.onMouseMove, false); + addListener('mouseup', this.onMouseUp, false); + } return this; }, /** - * Binds necessary events listeners. + * Makes specified column draggable. * - * @returns {Dnd} Chainbale. + * @param {HTMLTableHeaderCellElement} column - Columns header element. + * @returns {Dnd} Chainable. */ - initListeners: function () { - if (isTouchDevice) { - document.addEventListener('touchmove', this.onMouseMove, false); - document.addEventListener('touchend', this.onMouseUp, false); - document.addEventListener('touchleave', this.onMouseUp, false); - } else { - document.addEventListener('mousemove', this.onMouseMove, false); - document.addEventListener('mouseup', this.onMouseUp, false); - } + addColumn: function (column) { + this.columns.push(column); - this.columns.forEach(function (column) { - isTouchDevice ? - column.addEventListener('touchstart', this.onMouseDown, false) : - column.addEventListener('mousedown', this.onMouseDown, false); - }, this); + isTouchDevice ? + column.addEventListener('touchstart', this.onMouseDown, false) : + column.addEventListener('mousedown', this.onMouseDown, false); + + return this; + }, + + /** + * @param {HTMLTableElement} table + * @returns {Dnd} Chainable. + */ + addTable: function (table) { + this.table = table; + + return this; + }, + + /** + * @param {HTMLTableElement} dragTable + * @returns {Dnd} Chainable. + */ + addDragTable: function (dragTable) { + this.dragTable = dragTable; return this; }, @@ -175,7 +196,7 @@ define([ * @returns {Dnd} Chainbale. */ _cacheCoords: function () { - var container = this.grid.getBoundingClientRect(), + var container = this.table.getBoundingClientRect(), bodyRect = document.body.getBoundingClientRect(), grabbed = this.grabbed, dragElem = grabbed.elem, @@ -218,20 +239,23 @@ define([ * @returns {Dnd} Chainable. */ _copyDimensions: function (elem) { - var dragGrid = this.dragGrid, - dragTrs = dragGrid.tBodies[0].children, - origTrs = _.toArray(this.grid.tBodies[0].children), + var dragTable = this.dragTable, + dragBody = dragTable.tBodies[0], + dragTrs = dragBody ? dragBody.children : [], + origTrs = _.toArray(this.table.tBodies[0].children), columnIndex = _.toArray(elem.parentNode.cells).indexOf(elem), - origTd; + origTd, + dragTr; - dragGrid.style.width = elem.offsetWidth + 'px'; - dragGrid.tHead.firstElementChild.cells[0].style.height = elem.offsetHeight + 'px'; + dragTable.style.width = elem.offsetWidth + 'px'; + dragTable.tHead.firstElementChild.cells[0].style.height = elem.offsetHeight + 'px'; origTrs.forEach(function (origTr, rowIndex) { origTd = origTr.cells[columnIndex]; + dragTr = dragTrs[rowIndex]; - if (origTd) { - dragTrs[rowIndex].cells[0].style.height = origTd.offsetHeight + 'px'; + if (origTd && dragTr) { + dragTr.cells[0].style.height = origTd.offsetHeight + 'px'; } }); @@ -285,7 +309,7 @@ define([ this._cacheCoords() ._copyDimensions(elem); - $(this.dragGrid).removeClass(this.hiddenClass); + $(this.dragTable).removeClass(this.hiddenClass); }, /** @@ -306,7 +330,7 @@ define([ this.dragging = false; - $(this.dragGrid).addClass(this.hiddenClass); + $(this.dragTable).addClass(this.hiddenClass); getModel(elem).dragging(false); @@ -347,7 +371,7 @@ define([ target = getModel(target); elem = getModel(elem); - getModel(this.grid).insertChild(elem, target); + getModel(this.table).insertChild(elem, target); target.dragover(false); }, @@ -374,7 +398,7 @@ define([ posY = dragArea.orig.top; } - locate(this.dragGrid, posX, posY); + locate(this.dragTable, posX, posY); if (!isInside(x, y, this.dropArea)) { this._updateAreas(x, y); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/listing.js b/app/code/Magento/Ui/view/base/web/js/grid/listing.js index 13653fb0067..299560ba2bf 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/listing.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/listing.js @@ -3,11 +3,11 @@ * See COPYING.txt for license details. */ define([ - 'mageUtils', 'underscore', 'uiComponent', - 'Magento_Ui/js/lib/spinner' -], function (utils, _, Component, loader) { + 'Magento_Ui/js/lib/spinner', + 'Magento_Ui/js/core/renderer/layout' +], function (_, Component, loader, layout) { 'use strict'; return Component.extend({ @@ -17,6 +17,12 @@ define([ storageConfig: { positions: '${ $.storageConfig.path }.positions' }, + dndConfig: { + name: '${ $.name }_dnd', + component: 'Magento_Ui/js/grid/dnd', + containerTmpl: 'ui/grid/dnd/listing', + enabled: true + }, imports: { rows: '${ $.provider }:data.items' }, @@ -24,7 +30,25 @@ define([ elems: 'setPositions', '${ $.provider }:reload': 'showLoader', '${ $.provider }:reloaded': 'hideLoader' + }, + modules: { + dnd: '${ $.dndConfig.name }' + } + }, + + /** + * Initializes Listing component. + * + * @returns {Listing} Chainable. + */ + initialize: function () { + this._super(); + + if (this.dndConfig.enabled) { + this.initDnd(); } + + return this; }, /** @@ -39,6 +63,17 @@ define([ return this; }, + /** + * Creates drag&drop widget instance. + * + * @returns {Listing} Chainable. + */ + initDnd: function () { + layout([this.dndConfig]); + + return this; + }, + /** * Called when another element was added to current component. * diff --git a/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js b/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js new file mode 100644 index 00000000000..843372972e4 --- /dev/null +++ b/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js @@ -0,0 +1,19 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +define([ + 'ko' +], function (ko) { + 'use strict'; + + ko.bindingHandlers.afterRender = { + init: function (element, valueAccessor, allBindings, viewModel) { + var callback = valueAccessor(); + + if (typeof callback === 'function') { + callback(element, viewModel); + } + } + }; +}); diff --git a/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js b/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js deleted file mode 100644 index a45799bbdff..00000000000 --- a/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/dnd.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -define([ - 'ko', - 'jquery', - 'Magento_Ui/js/grid/dnd' -], function (ko, $, Dnd) { - 'use strict'; - - ko.bindingHandlers.gridDnd = { - init: function (element, valueAccessor, allBindings, viewModel) { - var callback = valueAccessor(); - - setTimeout(function () { - new Dnd({ - grid: element, - dragGridSelector: '.data-grid._dragging-copy', - columnsSelector: 'thead th._draggable' - }); - }, 2000); - } - }; -}); diff --git a/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js b/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js index 4f79b257c6f..2758b3f8c23 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/ko/initialize.js @@ -14,12 +14,11 @@ define([ './bind/optgroup', './bind/fadeVisible', './bind/mage-init', - './bind/dnd', + './bind/after-render', './extender/observable_array' -], function(ko, templateEngine) { +], function (ko, templateEngine) { 'use strict'; ko.setTemplateEngine(templateEngine); ko.applyBindings(); - }); diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/cells/html.html b/app/code/Magento/Ui/view/base/web/templates/grid/cells/html.html index 27d6bfcf621..166a4f1f9b7 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/cells/html.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/cells/html.html @@ -5,7 +5,9 @@ */ --> <td - data-bind="visible: visible, - click: isClickable(row) ? redirect.bind($data, getClickUrl(row)) : false, - html: getLabel(row[field.index])" + data-bind=" + visible: visible, + css: { _dragging: dragging }, + click: isClickable(row) ? redirect.bind($data, getClickUrl(row)) : false, + html: getLabel(row[field.index])" data-action="grid-row-edit"></td> \ No newline at end of file diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/cells/multiselect.html b/app/code/Magento/Ui/view/base/web/templates/grid/cells/multiselect.html index 81e6b2c5bc3..c11acd1f36e 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/cells/multiselect.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/cells/multiselect.html @@ -10,9 +10,12 @@ <input class="admin__control-checkbox" type="checkbox" - data-bind="checked: selected, - value: row[indexField], - attr: {id: 'check' + row[indexField]}"> + data-bind=" + checked: selected, + value: row[indexField], + attr: { + id: 'check' + row[indexField] + }"> <label data-bind="attr: {for: 'check' + row[indexField]}"></label> </label> </td> diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html b/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html index 1b06734b437..09ecafbdfba 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/cells/text.html @@ -5,8 +5,9 @@ */ --> <td - data-bind="visible: visible, - css: { _dragging: dragging }, - click: isClickable(row) ? redirect.bind($data, getClickUrl(row)) : false, - html: getLabel(row[field.index])" + data-bind=" + visible: visible, + css: { _dragging: dragging }, + click: isClickable(row) ? redirect.bind($data, getClickUrl(row)) : false, + text: getLabel(row[field.index])" data-action="grid-row-edit"></td> \ No newline at end of file diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/columns/actions.html b/app/code/Magento/Ui/view/base/web/templates/grid/columns/actions.html deleted file mode 100644 index 5d3aaa53d9b..00000000000 --- a/app/code/Magento/Ui/view/base/web/templates/grid/columns/actions.html +++ /dev/null @@ -1,10 +0,0 @@ -<!-- -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ ---> - -<th class="data-grid-th data-grid-actions-cell" data-bind="visible: visible"> - <span data-bind="text: label"></span> -</th> diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html b/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html index 2ecd156587d..41207503828 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/columns/text.html @@ -5,10 +5,14 @@ */ --> <th - class="data-grid-th _draggable" + class="data-grid-th" data-bind=" + afterRender: draggable && $parent.dndConfig.enabled ? + (function (elem) { $parent.dnd('addColumn', elem); }) : + false, css: { '_sortable': sortable, + '_draggable': draggable, '_ascend': sorting() === 'asc', '_descend': sorting() === 'desc', '_dragover-left': dragover() === 'right', diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html b/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html index 1a29fe19483..54f79e76730 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html @@ -5,7 +5,11 @@ * See COPYING.txt for license details. */ --> -<table class="data-grid _dragging-copy _hidden"> +<table + class="data-grid _dragging-copy _hidden" + data-bind=" + afterRender: function (elem) { dnd('addDragTable', elem); } + "> <thead data-part="head"> <tr data-part="head.row"> <!-- ko foreach: elems --> diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/listing.html b/app/code/Magento/Ui/view/base/web/templates/grid/listing.html index b57216bceb6..439fa197360 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/listing.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/listing.html @@ -5,7 +5,15 @@ */ --> <div class="admin__data-grid-wrap"> - <table class="data-grid data-grid-draggable" data-bind="gridDnd"> + <table + class="data-grid" + data-bind=" + afterRender: dndConfig.enabled ? + function (elem) { dnd('addTable', elem); } : + false, + css: { + 'data-grid-draggable': dndConfig.enabled + }"> <thead data-part="head"> <tr data-part="head.row"> <!-- ko foreach: elems --> @@ -32,5 +40,7 @@ <!-- /ko --> </tbody> </table> - <!-- ko template: 'ui/grid/dnd/listing' --><!-- /ko --> + <!-- ko if: dndConfig.enabled --> + <!-- ko template: dndConfig.containerTmpl --><!-- /ko --> + <!-- /ko --> </div> \ No newline at end of file -- GitLab From 48eaeabcbd2fa87f71afd41c3d308d93835bca22 Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Mon, 8 Jun 2015 21:16:19 +0300 Subject: [PATCH 085/396] MAGETWO-37555: Popup header is our of window range while creating group product --- .../view/adminhtml/web/js/grouped-product.js | 43 +++++-------------- .../Product/Grouped/AssociatedProducts.php | 2 +- .../Product/Grouped/AssociatedProducts.php | 2 +- 3 files changed, 13 insertions(+), 34 deletions(-) diff --git a/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js b/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js index c5437123aea..6bd12a1b9ed 100644 --- a/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js +++ b/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js @@ -7,8 +7,10 @@ define([ 'jquery', 'mage/template', 'jquery/ui', + 'Magento_Ui/js/modal/modal', 'mage/translate', - 'mage/adminhtml/grid' + 'mage/adminhtml/grid', + '' ], function ($, mageTemplate) { 'use strict'; @@ -94,7 +96,7 @@ define([ }, /** - * Create dialog for show product + * Create modal for show product * * @private */ @@ -103,48 +105,25 @@ define([ selectedProductList = {}, popup = $('[data-role=add-product-dialog]'); - popup.dialog({ + popup.modal({ + type: 'slide', + innerScroll: true, title: $.mage.__('Add Products to Group'), - autoOpen: false, - minWidth: 980, - width: '75%', - modal: true, - resizable: true, - dialogClass: 'grouped', - position: { - my: 'left top', - at: 'center top', - of: 'body' - }, + modalClass: 'grouped', open: function () { - $(this).closest('.ui-dialog').addClass('ui-dialog-active'); - - var topMargin = $(this).closest('.ui-dialog').children('.ui-dialog-titlebar').outerHeight() + 55; - $(this).closest('.ui-dialog').css('margin-top', topMargin); - $(this).addClass('admin__scope-old'); // ToDo UI: remove with old styles removal }, - close: function () { - $(this).closest('.ui-dialog').removeClass('ui-dialog-active'); - }, buttons: [{ id: 'grouped-product-dialog-apply-button', text: $.mage.__('Add Selected Products'), - 'class': 'action-primary action-add', + class: 'action-primary action-add', click: function () { $.each(selectedProductList, function (index, product) { widget._add(null, product); }); widget._resort(); widget._updateGridVisibility(); - $(this).dialog('close'); - } - }, { - id: 'grouped-product-dialog-cancel-button', - text: $.mage.__('Cancel'), - 'class': 'action-close', - click: function () { - $(this).dialog('close'); + popup.modal('closeModal'); } }] }); @@ -186,7 +165,7 @@ define([ $('[data-role=add-product]').on('click', function (event) { event.preventDefault(); - popup.dialog('open'); + popup.modal('openModal'); gridPopup.reload(); selectedProductList = {}; }); diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php index 59f48c60913..9bfa169eda2 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php @@ -30,7 +30,7 @@ class AssociatedProducts extends Tab * * @var string */ - protected $productSearchGrid = "./ancestor::body//div[div[contains(@data-role,'add-product-dialog')]]"; + protected $productSearchGrid = "./ancestor::body//div[div[div[contains(@data-role,'add-product-dialog')]]]"; /** * Associated products list block diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php index d888fa31e8e..8dde9ad28f8 100644 --- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php +++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php @@ -29,7 +29,7 @@ class AssociatedProducts extends Tab * * @var string */ - protected $productSearchGrid = "./ancestor::body//div[div[contains(@data-role,'add-product-dialog')]]"; + protected $productSearchGrid = "./ancestor::body//div[div[div[contains(@data-role,'add-product-dialog')]]]"; /** * Associated products list block -- GitLab From 27a4ec19f3cecb27004b0adc56d44269ff3329df Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Tue, 9 Jun 2015 09:14:55 +0300 Subject: [PATCH 086/396] MAGETWO-37555: Popup header is our of window range while creating group product --- .../Catalog/Test/Block/Product/Grouped/AssociatedProducts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php index 9bfa169eda2..59f48c60913 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Product/Grouped/AssociatedProducts.php @@ -30,7 +30,7 @@ class AssociatedProducts extends Tab * * @var string */ - protected $productSearchGrid = "./ancestor::body//div[div[div[contains(@data-role,'add-product-dialog')]]]"; + protected $productSearchGrid = "./ancestor::body//div[div[contains(@data-role,'add-product-dialog')]]"; /** * Associated products list block -- GitLab From 6ef3e2abeac042206178cf253e47764fda9e237b Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 9 Jun 2015 12:23:26 +0300 Subject: [PATCH 087/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../Test/Unit/Model/System/Message/SecurityTest.php | 2 +- .../Magento/Bundle/Test/Unit/Model/Product/TypeTest.php | 2 +- .../GoogleShopping/Test/Unit/Model/MassOperationsTest.php | 2 +- .../Test/Unit/Model/AuthorizationServiceTest.php | 2 +- .../Wishlist/Test/Unit/Controller/Index/SendTest.php | 6 +++--- .../testsuite/Magento/ImportExport/Model/ImportTest.php | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) 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 b4c8c3c6fb2..9e1937dae50 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 set up incorrectly.'; + $messageStart = 'Your web server is set up incorrectly'; $this->assertStringStartsWith($messageStart, (string)$this->_messageModel->getText()); } 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 64b4c6789f3..9fe5ccb2dae 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/GoogleShopping/Test/Unit/Model/MassOperationsTest.php b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php index 3930a68a2b8..aa66f7a7431 100644 --- a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php +++ b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php @@ -193,7 +193,7 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addMajor') ->with( 'Something went wrong during synchronization with Google Shopping.', - ['We cannot update 1 items.', 'The item "Product Name" hasn\'t been updated.'] + ['We can\'t update 1 items.', 'The item "Product Name" hasn\'t been updated.'] )->will($this->returnSelf()); $this->massOperations->synchronizeItems([1]); } diff --git a/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php b/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php index 50943355d83..309e3aa2e5e 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. You can find out more in the exceptions log. */ public function testRemovePermissionsException() { 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 55575d82b27..dd6dca98716 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/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php index 82606ef75ea..f2594a838a9 100644 --- a/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php +++ b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php @@ -155,8 +155,8 @@ 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() { $this->_importConfig->merge( -- GitLab From b94e1ee342e5eedad3694c96deb60da8adc81a27 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 9 Jun 2015 13:01:51 +0300 Subject: [PATCH 088/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../testsuite/Magento/Customer/Controller/AddressTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php index ee84c621bb4..f1a3573f3b0 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AddressTest.php @@ -174,7 +174,6 @@ class AddressTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/address/index')); $this->assertSessionMessages( - $this->equalTo(['Something went wrong while deleting the address.']), $this->equalTo(['We can\'t delete the address right now.']), \Magento\Framework\Message\MessageInterface::TYPE_ERROR ); -- GitLab From ef9d25538ebfed881b7bc579ea34d7d20b54e103 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Thu, 4 Jun 2015 21:55:25 +0300 Subject: [PATCH 089/396] MAGNSWTC-2: Add product details renderer list support on Catalog category page. (cherry picked from commit ef69a948489681bec780a4ee8f46736449863007) --- .../Catalog/Block/Product/AbstractProduct.php | 43 +++++++++++++++++++ .../frontend/layout/catalog_category_view.xml | 3 ++ .../frontend/templates/product/list.phtml | 5 ++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php index 0b62afa09de..dcab87ec01a 100644 --- a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php +++ b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php @@ -598,4 +598,47 @@ class AbstractProduct extends \Magento\Framework\View\Element\Template \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } + + /** + * Retrieve product details html + * + * @param \Magento\Catalog\Model\Product $product + * @return mixed + */ + public function getDetailsHtml(\Magento\Catalog\Model\Product $product) + { + $renderer = $this + ->getDetailsRenderer($product->getTypeId()) + ->setProduct($product); + + return $renderer->toHtml(); + } + + /** + * @param null $type + * @return bool|\Magento\Framework\View\Element\AbstractBlock + */ + public function getDetailsRenderer($type = null) + { + if ($type === null) { + $type = 'default'; + } + $rendererList = $this->getDetailsRendererList(); + if (!$rendererList) { + throw new \RuntimeException('Details renderer list for block "' . $this->getNameInLayout() . '" is not defined'); + } + return $rendererList->getRenderer($type, 'default'); + } + + /** + * @return \Magento\Framework\View\Element\RendererList + */ + protected function getDetailsRendererList() + { + return $this->getDetailsRendererListName() ? $this->getLayout()->getBlock( + $this->getDetailsRendererListName() + ) : $this->getChildBlock( + 'details.renderers' + ); + } } diff --git a/app/code/Magento/Catalog/view/frontend/layout/catalog_category_view.xml b/app/code/Magento/Catalog/view/frontend/layout/catalog_category_view.xml index f13c637c087..dbc1ff5933f 100644 --- a/app/code/Magento/Catalog/view/frontend/layout/catalog_category_view.xml +++ b/app/code/Magento/Catalog/view/frontend/layout/catalog_category_view.xml @@ -18,6 +18,9 @@ <block class="Magento\Catalog\Block\Category\View" name="category.products" template="Magento_Catalog::category/products.phtml"> <block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml"> <container name="category.product.list.additional" as="additional" /> + <block class="Magento\Framework\View\Element\RendererList" name="category.product.type.details.renderers" as="details.renderers"> + <block class="Magento\Framework\View\Element\Template" as="default"/> + </block> <block class="Magento\Catalog\Block\Product\ProductList\Toolbar" name="product_list_toolbar" template="product/list/toolbar.phtml"> <block class="Magento\Theme\Block\Html\Pager" name="product_list_toolbar_pager"/> <!-- The following code shows how to set your own pager increments --> 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 154454f16db..98daed2a026 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml @@ -69,6 +69,7 @@ $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\I </strong> <?php echo $block->getReviewsSummaryHtml($_product, $templateType); ?> <?php echo $block->getProductPrice($_product) ?> + <?php echo $block->getDetailsHtml($_product); ?> <div class="product-item-inner"> <div class="product actions product-item-actions"<?php echo strpos($pos, $viewMode . '-actions') ? $position : ''; ?>> @@ -94,7 +95,7 @@ $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\I </div> <div data-role="add-to-links" class="actions-secondary"<?php echo strpos($pos, $viewMode . '-secondary') ? $position : ''; ?>> <?php if ($this->helper('Magento\Wishlist\Helper\Data')->isAllow()): ?> - <a href="#" + <a href="#" class="action towishlist" title="<?php echo $block->escapeHtml(__('Add to Wish List')); ?>" aria-label="<?php echo $block->escapeHtml(__('Add to Wish List')); ?>" @@ -107,7 +108,7 @@ $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\I <?php $compareHelper = $this->helper('Magento\Catalog\Helper\Product\Compare'); ?> - <a href="#" + <a href="#" class="action tocompare" title="<?php echo $block->escapeHtml(__('Add to Compare')); ?>" aria-label="<?php echo $block->escapeHtml(__('Add to Compare')); ?>" -- GitLab From 6c5f90813c73bf6077c66c8548575897fc987422 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Fri, 5 Jun 2015 22:39:10 +0300 Subject: [PATCH 090/396] MAGNSWTC-2: Add FrontendType - FrontendInputType bridge (cherry picked from commit 9b850fa6d963ec21e9ccb905f5dbe0ddf6eb622d) --- .../Resource/Product/Indexer/Eav/Source.php | 13 +++++- .../CatalogSearch/Model/Resource/Engine.php | 14 +++++- .../Eav/Model/Attribute/FrontendType.php | 45 +++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 app/code/Magento/Eav/Model/Attribute/FrontendType.php 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 287847f4acf..c2856a641f8 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 @@ -21,6 +21,11 @@ class Source extends AbstractEav */ protected $_resourceHelper; + /** + * @var \Magento\Eav\Model\Attribute\FrontendType + */ + protected $frontendType; + /** * Construct * @@ -35,9 +40,11 @@ class Source extends AbstractEav \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Catalog\Model\Resource\Helper $resourceHelper, + \Magento\Eav\Model\Attribute\FrontendType $frontendType, $resourcePrefix = null ) { $this->_resourceHelper = $resourceHelper; + $this->frontendType = $frontendType; parent::__construct($context, $eavConfig, $eventManager, $resourcePrefix); } @@ -71,9 +78,11 @@ class Source extends AbstractEav ); if ($multiSelect == true) { - $select->where('ea.backend_type = ?', 'varchar')->where('ea.frontend_input = ?', 'multiselect'); + $select->where('ea.backend_type = ?', 'varchar') + ->where('ea.frontend_input in (?)', $this->frontendType->getInputs('multiselect')); } else { - $select->where('ea.backend_type = ?', 'int')->where('ea.frontend_input = ?', 'select'); + $select->where('ea.backend_type = ?', 'int') + ->where('ea.frontend_input in (?)', $this->frontendType->getInputs('select')); } return $this->_getReadAdapter()->fetchCol($select); diff --git a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php index 8fb3a099d23..134f1006f76 100644 --- a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php +++ b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php @@ -30,6 +30,11 @@ class Engine extends AbstractDb implements EngineInterface */ protected $productFactoryNames; + /** + * @var \Magento\Eav\Model\Attribute\FrontendType + */ + protected $frontendType; + /** * Catalog search data * @@ -51,11 +56,13 @@ class Engine extends AbstractDb implements EngineInterface \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility, \Magento\CatalogSearch\Model\Resource\Advanced $searchResource, \Magento\CatalogSearch\Helper\Data $catalogSearchData, + \Magento\Eav\Model\Attribute\FrontendType $frontendType, $resourcePrefix = null ) { $this->_catalogProductVisibility = $catalogProductVisibility; $this->_searchResource = $searchResource; $this->_catalogSearchData = $catalogSearchData; + $this->frontendType = $frontendType; parent::__construct($context, $resourcePrefix); } @@ -148,10 +155,15 @@ class Engine extends AbstractDb implements EngineInterface */ private function isTermFilterableAttribute($attribute) { + $inputTypes = array_merge( + $this->frontendType->getInputs('select'), + $this->frontendType->getInputs('multiselect') + ); + return ($attribute->getIsVisibleInAdvancedSearch() || $attribute->getIsFilterable() || $attribute->getIsFilterableInSearch()) - && in_array($attribute->getFrontendInput(), ['select', 'multiselect']); + && in_array($attribute->getFrontendInput(), $inputTypes); } /** diff --git a/app/code/Magento/Eav/Model/Attribute/FrontendType.php b/app/code/Magento/Eav/Model/Attribute/FrontendType.php new file mode 100644 index 00000000000..0decac13cf9 --- /dev/null +++ b/app/code/Magento/Eav/Model/Attribute/FrontendType.php @@ -0,0 +1,45 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Eav\Model\Attribute; + +/** + * Class FrontendType + */ +class FrontendType +{ + private $config; + + public function __construct($config = []) + { + $this->config = $config; + } + + /** + * Return list of input types by frontend type + * + * @param $inputType + * @return string + */ + public function getType($inputType) + { + return array_search($inputType, $this->config); + } + + /** + * Return frontend type by input type + * + * @param string $frontendType + * @return string[] + */ + public function getInputs($frontendType) + { + if (isset($this->config[$frontendType]) && is_array($this->config[$frontendType])) { + return array_values($this->config[$frontendType]); + } + return [$frontendType]; + } +} -- GitLab From a107752efcdc1b8882fd08eafbccd0e790724463 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Wed, 3 Jun 2015 20:18:24 +0300 Subject: [PATCH 091/396] Changes in CE (cherry picked from commit 081cb08102e5ddbc73c0207e61ca04ac52cb9885) --- .../Model/SuggestedAttributeList.php | 62 +++++++++++++++---- .../frontend/Magento/blank/etc/view.xml | 8 +++ app/design/frontend/Magento/luma/etc/view.xml | 8 +++ 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/app/code/Magento/ConfigurableProduct/Model/SuggestedAttributeList.php b/app/code/Magento/ConfigurableProduct/Model/SuggestedAttributeList.php index 5a47edceda3..610d597a08a 100644 --- a/app/code/Magento/ConfigurableProduct/Model/SuggestedAttributeList.php +++ b/app/code/Magento/ConfigurableProduct/Model/SuggestedAttributeList.php @@ -14,25 +14,45 @@ class SuggestedAttributeList * * @var \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory */ - protected $_attributeColFactory; + protected $attributeCollectionFactory; /** * Catalog resource helper * * @var \Magento\Catalog\Model\Resource\Helper */ - protected $_resourceHelper; + protected $resourceHelper; /** - * @param \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeColFactory + * Application Event Dispatcher + * + * @var \Magento\Framework\Event\ManagerInterface + */ + protected $eventManager; + + /** + * Object Factory + * + * @var \Magento\Framework\ObjectFactory + */ + protected $objectFactory; + + /** + * @param \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeCollectionFactory * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper + * @param \Magento\Framework\Event\ManagerInterface $eventManager + * @param \Magento\Framework\ObjectFactory $objectFactory */ public function __construct( - \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeColFactory, - \Magento\Catalog\Model\Resource\Helper $resourceHelper + \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory $attributeCollectionFactory, + \Magento\Catalog\Model\Resource\Helper $resourceHelper, + \Magento\Framework\Event\ManagerInterface $eventManager, + \Magento\Framework\ObjectFactory $objectFactory ) { - $this->_attributeColFactory = $attributeColFactory; - $this->_resourceHelper = $resourceHelper; + $this->attributeCollectionFactory = $attributeCollectionFactory; + $this->resourceHelper = $resourceHelper; + $this->objectFactory = $objectFactory; + $this->eventManager = $eventManager; } /** @@ -43,12 +63,14 @@ class SuggestedAttributeList */ public function getSuggestedAttributes($labelPart) { - $escapedLabelPart = $this->_resourceHelper->addLikeEscape($labelPart, ['position' => 'any']); + $escapedLabelPart = $this->resourceHelper->addLikeEscape($labelPart, ['position' => 'any']); + $availableFrontendTypes = $this->getAvailableFrontendTypes(); + /** @var $collection \Magento\Catalog\Model\Resource\Product\Attribute\Collection */ - $collection = $this->_attributeColFactory->create(); + $collection = $this->attributeCollectionFactory->create(); $collection->addFieldToFilter( - 'frontend_input', - 'select' + 'main_table.frontend_input', + ['in' => $availableFrontendTypes->getData('values')] )->addFieldToFilter( 'frontend_label', ['like' => $escapedLabelPart] @@ -79,4 +101,22 @@ class SuggestedAttributeList } return $result; } + + /** + * @return \Magento\Framework\Object + */ + private function getAvailableFrontendTypes() + { + $availableFrontendTypes = $this->objectFactory->create(); + $availableFrontendTypes->setData( + [ + 'values' => ['select'] + ] + ); + $this->eventManager->dispatch( + 'product_suggested_attribute_frontend_type_init_after', + ['types_dto' => $availableFrontendTypes] + ); + return $availableFrontendTypes; + } } diff --git a/app/design/frontend/Magento/blank/etc/view.xml b/app/design/frontend/Magento/blank/etc/view.xml index 84c78279b3c..b9864e298b7 100644 --- a/app/design/frontend/Magento/blank/etc/view.xml +++ b/app/design/frontend/Magento/blank/etc/view.xml @@ -185,6 +185,14 @@ <var name="product_stock_alert_email_product_image:width">76</var> <var name="product_stock_alert_email_product_image:ratio">1</var> <var name="product_stock_alert_email_product_image:height">76</var> + + <var name="swatch_image:width">30</var> + <var name="swatch_image:ratio">0.8</var> + <var name="swatch_image:height">20</var> + + <var name="swatch_thumb:width">110</var> + <var name="swatch_thumb:ratio">0.8</var> + <var name="swatch_thumb:height">90</var> </vars> <vars module="Magento_Bundle"> <var name="product_summary_image_size">58</var> <!-- New Product image size used for summary block--> diff --git a/app/design/frontend/Magento/luma/etc/view.xml b/app/design/frontend/Magento/luma/etc/view.xml index a72c461ffa0..1d3fb18268e 100644 --- a/app/design/frontend/Magento/luma/etc/view.xml +++ b/app/design/frontend/Magento/luma/etc/view.xml @@ -190,6 +190,14 @@ <var name="product_stock_alert_email_product_image:width">76</var> <var name="product_stock_alert_email_product_image:ratio">1</var> <var name="product_stock_alert_email_product_image:height">76</var> + + <var name="swatch_image:width">30</var> + <var name="swatch_image:ratio">0.8</var> + <var name="swatch_image:height">20</var> + + <var name="swatch_thumb:width">110</var> + <var name="swatch_thumb:ratio">0.8</var> + <var name="swatch_thumb:height">90</var> </vars> <vars module="Magento_Bundle"> <var name="product_summary_image_size">58</var> <!-- New Product image size used for summary block--> -- GitLab From 2d41debbfa734b7372553fa5628599cdb1e18ee5 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 9 Jun 2015 16:24:09 +0300 Subject: [PATCH 092/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../Integration/Test/Unit/Model/AuthorizationServiceTest.php | 2 +- app/code/Magento/SendFriend/view/frontend/templates/send.phtml | 2 +- .../testsuite/Magento/ImportExport/Model/ImportTest.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php b/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php index 309e3aa2e5e..77df24ca983 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 Something went wrong while deleting roles and permissions. You can find out more in the exceptions log. + * @expectedExceptionMessage Something went wrong while deleting roles and permissions. */ public function testRemovePermissionsException() { diff --git a/app/code/Magento/SendFriend/view/frontend/templates/send.phtml b/app/code/Magento/SendFriend/view/frontend/templates/send.phtml index 84f987e8f2c..8f44dc56e20 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 __('Registrant') ?></span></legend> + <legend class="legend"><span><?php echo __('Invitee') ?></span></legend> <br /> <div id="recipients-options"></div> <?php if ($block->getMaxRecipients()): ?> diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php index f2594a838a9..fcf5c91c4a8 100644 --- a/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php +++ b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php @@ -156,7 +156,7 @@ class ImportTest extends \PHPUnit_Framework_TestCase * * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage The behavior token for customer is invalid. -*/ + */ public function testGetEntityBehaviorsWithUnknownBehavior() { $this->_importConfig->merge( -- GitLab From 9b948b84d606afacf8bff301f076ebcc063868ce Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 9 Jun 2015 17:32:30 +0300 Subject: [PATCH 093/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../testsuite/Magento/ImportExport/Model/ImportTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php index fcf5c91c4a8..788e55647ad 100644 --- a/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php +++ b/dev/tests/integration/testsuite/Magento/ImportExport/Model/ImportTest.php @@ -156,7 +156,7 @@ class ImportTest extends \PHPUnit_Framework_TestCase * * @expectedException \Magento\Framework\Exception\LocalizedException * @expectedExceptionMessage The behavior token for customer is invalid. - */ + */ public function testGetEntityBehaviorsWithUnknownBehavior() { $this->_importConfig->merge( -- GitLab From fa4ccdc63189e20ef4d1c7ccd8e40da6bbcdf4f2 Mon Sep 17 00:00:00 2001 From: Olga Kopylova <okopylova@ebay.com> Date: Tue, 9 Jun 2015 09:25:44 -0500 Subject: [PATCH 094/396] MAGETWO-37894: Images can't be loaded if using separate Media Storage and disabled Webserver rewrites - fixed usage of Media directory to support custom path - fixed connection to DB media storage --- app/code/Magento/Catalog/etc/config.xml | 1 + app/code/Magento/MediaStorage/App/Media.php | 117 +++----- .../Model/File/Storage/Config.php | 6 +- .../Storage/Database/AbstractDatabase.php | 28 +- .../Model/File/Storage/Request.php | 28 +- .../Model/File/Storage/Synchronization.php | 14 +- .../MediaStorage/Test/Unit/App/MediaTest.php | 273 +++++++----------- .../Unit/Model/File/Storage/ConfigTest.php | 2 +- .../File/Storage/Directory/DatabaseTest.php | 9 + .../Unit/Model/File/Storage/RequestTest.php | 12 +- .../File/Storage/SynchronizationTest.php | 40 +-- .../Test/Legacy/_files/obsolete_classes.php | 1 + .../Test/Legacy/_files/obsolete_methods.php | 2 +- pub/get.php | 59 ++-- 14 files changed, 246 insertions(+), 346 deletions(-) diff --git a/app/code/Magento/Catalog/etc/config.xml b/app/code/Magento/Catalog/etc/config.xml index 9d4433c0454..75518179376 100644 --- a/app/code/Magento/Catalog/etc/config.xml +++ b/app/code/Magento/Catalog/etc/config.xml @@ -51,6 +51,7 @@ <system> <media_storage_configuration> <allowed_resources> + <tmp_images_folder>tmp</tmp_images_folder> <catalog_images_folder>catalog</catalog_images_folder> <product_custom_options_fodler>custom_options</product_custom_options_fodler> </allowed_resources> diff --git a/app/code/Magento/MediaStorage/App/Media.php b/app/code/Magento/MediaStorage/App/Media.php index f7c60c1a4ee..8c4370f05f3 100644 --- a/app/code/Magento/MediaStorage/App/Media.php +++ b/app/code/Magento/MediaStorage/App/Media.php @@ -7,107 +7,95 @@ */ namespace Magento\MediaStorage\App; -use Magento\MediaStorage\Model\File\Storage\Request; +use Magento\Framework\Filesystem; +use Magento\MediaStorage\Model\File\Storage\ConfigFactory; use Magento\MediaStorage\Model\File\Storage\Response; use Magento\Framework\App; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\AppInterface; -use Magento\Framework\ObjectManagerInterface; +use Magento\MediaStorage\Model\File\Storage\SynchronizationFactory; class Media implements AppInterface { - /** - * @var \Magento\Framework\ObjectManagerInterface - */ - protected $_objectManager; - - /** - * @var \Magento\MediaStorage\Model\File\Storage\Request - */ - protected $_request; - /** * Authorization function * * @var \Closure */ - protected $_isAllowed; + private $isAllowed; /** * Media directory path * * @var string */ - protected $_mediaDirectory; + private $mediaDirectoryPath; /** * Configuration cache file path * * @var string */ - protected $_configCacheFile; + private $configCacheFile; /** * Requested file name relative to working directory * * @var string */ - protected $_relativeFileName; + private $relativeFileName; /** - * Working directory - * - * @var string + * @var \Magento\MediaStorage\Model\File\Storage\Response */ - protected $_workingDirectory; + private $response; /** - * @var \Magento\MediaStorage\Model\File\Storage\Response + * @var \Magento\Framework\Filesystem\Directory\Read $directory */ - protected $_response; + private $directory; /** - * @var \Magento\Framework\Filesystem $filesystem + * @var ConfigFactory */ - protected $filesystem; + private $configFactory; /** - * @var \Magento\Framework\Filesystem\Directory\Read $directory + * @var SynchronizationFactory */ - protected $directory; + private $syncFactory; /** - * @param ObjectManagerInterface $objectManager - * @param Request $request + * @param ConfigFactory $configFactory + * @param SynchronizationFactory $syncFactory * @param Response $response * @param \Closure $isAllowed - * @param string $workingDirectory * @param string $mediaDirectory * @param string $configCacheFile * @param string $relativeFileName - * @param \Magento\Framework\Filesystem $filesystem + * @param Filesystem $filesystem */ public function __construct( - ObjectManagerInterface $objectManager, - Request $request, + ConfigFactory $configFactory, + SynchronizationFactory $syncFactory, Response $response, \Closure $isAllowed, - $workingDirectory, $mediaDirectory, $configCacheFile, $relativeFileName, - \Magento\Framework\Filesystem $filesystem + Filesystem $filesystem ) { - $this->_objectManager = $objectManager; - $this->_request = $request; - $this->_response = $response; - $this->_isAllowed = $isAllowed; - $this->_workingDirectory = $workingDirectory; - $this->_mediaDirectory = $mediaDirectory; - $this->_configCacheFile = $configCacheFile; - $this->_relativeFileName = $relativeFileName; - $this->filesystem = $filesystem; - $this->directory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA); + $this->response = $response; + $this->isAllowed = $isAllowed; + $this->directory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA); + $mediaDirectory = trim($mediaDirectory); + if (!empty($mediaDirectory)) { + $this->mediaDirectoryPath = str_replace('\\', '/', realpath($mediaDirectory)); + } + $this->configCacheFile = $configCacheFile; + $this->relativeFileName = $relativeFileName; + $this->configFactory = $configFactory; + $this->syncFactory = $syncFactory; } /** @@ -118,38 +106,29 @@ class Media implements AppInterface */ public function launch() { - if (!$this->_mediaDirectory) { - $config = $this->_objectManager->create( - 'Magento\MediaStorage\Model\File\Storage\Config', - ['cacheFile' => $this->_configCacheFile] - ); + if ($this->mediaDirectoryPath !== $this->directory->getAbsolutePath()) { + // Path to media directory changed or absent - update the config + /** @var \Magento\MediaStorage\Model\File\Storage\Config $config */ + $config = $this->configFactory->create(['cacheFile' => $this->configCacheFile]); $config->save(); - $this->_mediaDirectory = str_replace($this->_workingDirectory, '', $config->getMediaDirectory()); + $this->mediaDirectoryPath = $config->getMediaDirectory(); $allowedResources = $config->getAllowedResources(); - $this->_relativeFileName = str_replace( - $this->_mediaDirectory . '/', - '', - $this->_request->getPathInfo() - ); - $isAllowed = $this->_isAllowed; - if (!$isAllowed($this->_relativeFileName, $allowedResources)) { + $isAllowed = $this->isAllowed; + if (!$isAllowed($this->relativeFileName, $allowedResources)) { throw new \LogicException('The specified path is not allowed.'); } } - if (0 !== stripos($this->_request->getPathInfo(), $this->_mediaDirectory . '/')) { - throw new \LogicException('The specified path is not within media directory.'); - } - - $sync = $this->_objectManager->get('Magento\MediaStorage\Model\File\Storage\Synchronization'); - $sync->synchronize($this->_relativeFileName, $this->_request->getFilePath()); + /** @var \Magento\MediaStorage\Model\File\Storage\Synchronization $sync */ + $sync = $this->syncFactory->create(['directory' => $this->directory]); + $sync->synchronize($this->relativeFileName); - if ($this->directory->isReadable($this->directory->getRelativePath($this->_request->getFilePath()))) { - $this->_response->setFilePath($this->_request->getFilePath()); + if ($this->directory->isReadable($this->relativeFileName)) { + $this->response->setFilePath($this->directory->getAbsolutePath($this->relativeFileName)); } else { - $this->_response->setHttpResponseCode(404); + $this->response->setHttpResponseCode(404); } - return $this->_response; + return $this->response; } /** @@ -157,8 +136,8 @@ class Media implements AppInterface */ public function catchException(App\Bootstrap $bootstrap, \Exception $exception) { - $this->_response->setHttpResponseCode(404); - $this->_response->sendHeaders(); + $this->response->setHttpResponseCode(404); + $this->response->sendHeaders(); return true; } } diff --git a/app/code/Magento/MediaStorage/Model/File/Storage/Config.php b/app/code/Magento/MediaStorage/Model/File/Storage/Config.php index 40443458490..e57770297f8 100644 --- a/app/code/Magento/MediaStorage/Model/File/Storage/Config.php +++ b/app/code/Magento/MediaStorage/Model/File/Storage/Config.php @@ -31,7 +31,7 @@ class Config * * @var DirectoryWrite */ - protected $pubDirectory; + protected $rootDirectory; /** * @param \Magento\MediaStorage\Model\File\Storage $storage @@ -44,7 +44,7 @@ class Config $cacheFile ) { $this->config = $storage->getScriptConfig(); - $this->pubDirectory = $filesystem->getDirectoryWrite(DirectoryList::PUB); + $this->rootDirectory = $filesystem->getDirectoryWrite(DirectoryList::ROOT); $this->cacheFilePath = $cacheFile; } @@ -76,7 +76,7 @@ class Config public function save() { /** @var Write $file */ - $file = $this->pubDirectory->openFile($this->pubDirectory->getRelativePath($this->cacheFilePath), 'w'); + $file = $this->rootDirectory->openFile($this->rootDirectory->getRelativePath($this->cacheFilePath), 'w'); try { $file->lock(); $file->write(json_encode($this->config)); diff --git a/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php b/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php index 7c1c1401b2d..aa163521580 100644 --- a/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php +++ b/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php @@ -10,6 +10,11 @@ namespace Magento\MediaStorage\Model\File\Storage\Database; */ abstract class AbstractDatabase extends \Magento\Framework\Model\AbstractModel { + /** + * Default connection + */ + const CONNECTION_DEFAULT = 'default_setup'; + /** * Store media base directory path * @@ -36,6 +41,13 @@ abstract class AbstractDatabase extends \Magento\Framework\Model\AbstractModel */ protected $_configuration; + /** + * Connection name + * + * @var string + */ + private $connectionName = self::CONNECTION_DEFAULT; + /** * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry @@ -81,7 +93,7 @@ abstract class AbstractDatabase extends \Magento\Framework\Model\AbstractModel 'default' ); if (empty($connectionName)) { - $connectionName = 'default_setup'; + $connectionName = self::CONNECTION_DEFAULT; } return $connectionName; } @@ -120,10 +132,20 @@ abstract class AbstractDatabase extends \Magento\Framework\Model\AbstractModel public function setConnectionName($connectionName) { if (!empty($connectionName)) { - $this->setData('connection_name', $connectionName); - $this->_getResource()->setConnectionName($connectionName); + $this->connectionName = $connectionName; + $this->_getResource()->setConnectionName($this->connectionName); } return $this; } + + /** + * Get connection name + * + * @return null|string + */ + public function getConnectionName() + { + return $this->connectionName; + } } diff --git a/app/code/Magento/MediaStorage/Model/File/Storage/Request.php b/app/code/Magento/MediaStorage/Model/File/Storage/Request.php index db8feafbeeb..72bb21ba733 100644 --- a/app/code/Magento/MediaStorage/Model/File/Storage/Request.php +++ b/app/code/Magento/MediaStorage/Model/File/Storage/Request.php @@ -14,24 +14,14 @@ class Request * * @var string */ - protected $_pathInfo; + private $pathInfo; /** - * Requested file path - * - * @var string - */ - protected $_filePath; - - /** - * @param string $workingDir * @param HttpRequest $request */ - public function __construct($workingDir, HttpRequest $request = null) + public function __construct(HttpRequest $request) { - $request = $request ?: new HttpRequest(); - $this->_pathInfo = str_replace('..', '', ltrim($request->getPathInfo(), '/')); - $this->_filePath = $workingDir . '/' . $this->_pathInfo; + $this->pathInfo = str_replace('..', '', ltrim($request->getPathInfo(), '/')); } /** @@ -41,16 +31,6 @@ class Request */ public function getPathInfo() { - return $this->_pathInfo; - } - - /** - * Retrieve file path - * - * @return string - */ - public function getFilePath() - { - return $this->_filePath; + return $this->pathInfo; } } diff --git a/app/code/Magento/MediaStorage/Model/File/Storage/Synchronization.php b/app/code/Magento/MediaStorage/Model/File/Storage/Synchronization.php index 88a72ad5c6e..97ef3597b2d 100644 --- a/app/code/Magento/MediaStorage/Model/File/Storage/Synchronization.php +++ b/app/code/Magento/MediaStorage/Model/File/Storage/Synchronization.php @@ -5,7 +5,6 @@ */ namespace Magento\MediaStorage\Model\File\Storage; -use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem\Directory\WriteInterface as DirectoryWrite; use Magento\Framework\Filesystem\File\Write; use Magento\Framework\Exception\FileSystemException; @@ -27,29 +26,28 @@ class Synchronization * * @var DirectoryWrite */ - protected $pubDirectory; + protected $mediaDirectory; /** * @param \Magento\MediaStorage\Model\File\Storage\DatabaseFactory $storageFactory - * @param \Magento\Framework\Filesystem $filesystem + * @param DirectoryWrite $directory */ public function __construct( \Magento\MediaStorage\Model\File\Storage\DatabaseFactory $storageFactory, - \Magento\Framework\Filesystem $filesystem + DirectoryWrite $directory ) { $this->storageFactory = $storageFactory; - $this->pubDirectory = $filesystem->getDirectoryWrite(DirectoryList::PUB); + $this->mediaDirectory = $directory; } /** * Synchronize file * * @param string $relativeFileName - * @param string $filePath * @return void * @throws \LogicException */ - public function synchronize($relativeFileName, $filePath) + public function synchronize($relativeFileName) { /** @var $storage \Magento\MediaStorage\Model\File\Storage\Database */ $storage = $this->storageFactory->create(); @@ -59,7 +57,7 @@ class Synchronization } if ($storage->getId()) { /** @var Write $file */ - $file = $this->pubDirectory->openFile($this->pubDirectory->getRelativePath($filePath), 'w'); + $file = $this->mediaDirectory->openFile($relativeFileName, 'w'); try { $file->lock(); $file->write($storage->getContent()); diff --git a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php index 78a2ae48f75..acc2b3f91a1 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php @@ -9,138 +9,127 @@ use Magento\Framework\App\Filesystem\DirectoryList; class MediaTest extends \PHPUnit_Framework_TestCase { + const MEDIA_DIRECTORY = 'mediaDirectory'; + const RELATIVE_FILE_PATH = 'test/file.png'; + const CACHE_FILE_PATH = 'var'; + /** * @var \Magento\MediaStorage\App\Media */ - protected $_model; + private $model; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\MediaStorage\Model\File\Storage\ConfigFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $_objectManagerMock; + private $configFactoryMock; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\MediaStorage\Model\File\Storage\SynchronizationFactory|\PHPUnit_Framework_MockObject_MockObject */ - protected $_requestMock; + private $syncFactoryMock; /** * @var callable */ - protected $_closure; + private $closure; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_configMock; + private $configMock; /** * @var \PHPUnit_Framework_MockObject_MockObject */ - protected $_sync; + private $sync; /** - * @var string - */ - protected $_mediaDirectory = 'mediaDirectory'; - - /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var \Magento\MediaStorage\Model\File\Storage\Response|\PHPUnit_Framework_MockObject_MockObject */ - protected $_responseMock; + private $responseMock; /** * @var \Magento\Framework\Filesystem|\PHPUnit_Framework_MockObject_MockObject */ - protected $filesystemMock; + private $filesystemMock; /** * @var \Magento\Framework\Filesystem\Directory\Read|\PHPUnit_Framework_MockObject_MockObject */ - protected $directoryReadMock; + private $directoryMock; protected function setUp() { - $this->_requestMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\Request', [], [], '', false); - $this->_closure = function () { + $this->closure = function () { return true; }; - $this->_objectManagerMock = $this->getMock('Magento\Framework\ObjectManagerInterface'); - $this->_configMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\Config', [], [], '', false); - $this->_sync = $this->getMock('Magento\MediaStorage\Model\File\Storage\Synchronization', [], [], '', false); + $this->configMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\Config', [], [], '', false); + $this->sync = $this->getMock('Magento\MediaStorage\Model\File\Storage\Synchronization', [], [], '', false); + $this->configFactoryMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\ConfigFactory', [], [], '', false); + $this->configFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->configMock)); + $this->syncFactoryMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\SynchronizationFactory', [], [], '', false); + $this->syncFactoryMock->expects($this->any()) + ->method('create') + ->will($this->returnValue($this->sync)); $this->filesystemMock = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); - $this->directoryReadMock = $this->getMock( - 'Magento\Framework\Filesystem\Directory\Read', - [], - [], - '', - false - ); - - $this->filesystemMock->expects( - $this->any() - )->method( - 'getDirectoryRead' - )->with( - DirectoryList::MEDIA - )->will( - $this->returnValue($this->directoryReadMock) - ); - - $this->_responseMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\Response', [], [], '', false); - - $map = [ - ['Magento\MediaStorage\Model\File\Storage\Request', $this->_requestMock], - ['Magento\MediaStorage\Model\File\Storage\Synchronization', $this->_sync], - ]; - $this->_model = new \Magento\MediaStorage\App\Media( - $this->_objectManagerMock, - $this->_requestMock, - $this->_responseMock, - $this->_closure, - 'baseDir', - 'mediaDirectory', - 'var', - 'params', + $this->directoryMock = $this->getMockForAbstractClass('Magento\Framework\Filesystem\Directory\WriteInterface'); + + $this->filesystemMock->expects($this->any()) + ->method('getDirectoryWrite') + ->with(DirectoryList::MEDIA) + ->will($this->returnValue($this->directoryMock)); + + $this->responseMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\Response', [], [], '', false); + + $this->model = new \Magento\MediaStorage\App\Media( + $this->configFactoryMock, + $this->syncFactoryMock, + $this->responseMock, + $this->closure, + self::MEDIA_DIRECTORY, + self::CACHE_FILE_PATH, + self::RELATIVE_FILE_PATH, $this->filesystemMock ); - $this->_objectManagerMock->expects($this->any())->method('get')->will($this->returnValueMap($map)); } protected function tearDown() { - unset($this->_model); + unset($this->model); } - /** - * @expectedException \LogicException - * @expectedExceptionMessage The specified path is not within media directory. - */ public function testProcessRequestCreatesConfigFileMediaDirectoryIsNotProvided() { - $this->_model = new \Magento\MediaStorage\App\Media( - $this->_objectManagerMock, - $this->_requestMock, - $this->_responseMock, - $this->_closure, - 'baseDir', + $this->model = new \Magento\MediaStorage\App\Media( + $this->configFactoryMock, + $this->syncFactoryMock, + $this->responseMock, + $this->closure, false, - 'var', - 'params', + self::CACHE_FILE_PATH, + self::RELATIVE_FILE_PATH, $this->filesystemMock ); - $this->_objectManagerMock->expects( - $this->once() - )->method( - 'create' - )->with( - 'Magento\MediaStorage\Model\File\Storage\Config' - )->will( - $this->returnValue($this->_configMock) - ); - $this->_configMock->expects($this->once())->method('save'); - $this->_model->launch(); + $filePath = '/absolute/path/to/test/file.png'; + $this->directoryMock->expects($this->any()) + ->method('getAbsolutePath') + ->will($this->returnValueMap( + [ + [null, self::MEDIA_DIRECTORY], + [self::RELATIVE_FILE_PATH, $filePath], + ] + )); + $this->configMock->expects($this->once())->method('save'); + $this->sync->expects($this->once())->method('synchronize')->with(self::RELATIVE_FILE_PATH); + $this->directoryMock->expects($this->once()) + ->method('isReadable') + ->with(self::RELATIVE_FILE_PATH) + ->will($this->returnValue(true)); + $this->responseMock->expects($this->once())->method('setFilePath')->with($filePath); + $this->model->launch(); } /** @@ -149,101 +138,59 @@ class MediaTest extends \PHPUnit_Framework_TestCase */ public function testProcessRequestReturnsNotFoundResponseIfResourceIsNotAllowed() { - $this->_closure = function () { + $this->closure = function () { return false; }; - $this->_model = new \Magento\MediaStorage\App\Media( - $this->_objectManagerMock, - $this->_requestMock, - $this->_responseMock, - $this->_closure, - 'baseDir', + $this->model = new \Magento\MediaStorage\App\Media( + $this->configFactoryMock, + $this->syncFactoryMock, + $this->responseMock, + $this->closure, false, - 'var', - 'params', + self::CACHE_FILE_PATH, + self::RELATIVE_FILE_PATH, $this->filesystemMock ); - $this->_requestMock->expects($this->once())->method('getPathInfo'); - $this->_objectManagerMock->expects( - $this->once() - )->method( - 'create' - )->with( - 'Magento\MediaStorage\Model\File\Storage\Config' - )->will( - $this->returnValue($this->_configMock) - ); - $this->_configMock->expects($this->once())->method('getAllowedResources')->will($this->returnValue(false)); - $this->_model->launch(); - } - - /** - * @expectedException \LogicException - * @expectedExceptionMessage The specified path is not within media directory. - */ - public function testProcessRequestReturnsNotFoundIfFileIsNotAllowed() - { - $this->_configMock->expects($this->never())->method('save'); - $this->_requestMock->expects($this->once())->method('getPathInfo'); - $this->_requestMock->expects($this->never())->method('getFilePath'); - $this->_model->launch(); + $this->directoryMock->expects($this->once()) + ->method('getAbsolutePath') + ->with() + ->will($this->returnValue(self::MEDIA_DIRECTORY)); + $this->configMock->expects($this->once())->method('getAllowedResources')->will($this->returnValue(false)); + $this->model->launch(); } public function testProcessRequestReturnsFileIfItsProperlySynchronized() { - $relativeFilePath = '_files'; - $filePath = str_replace('\\', '/', __DIR__ . '/' . $relativeFilePath); - $this->_requestMock->expects( - $this->any() - )->method( - 'getPathInfo' - )->will( - $this->returnValue($this->_mediaDirectory . '/') - ); - $this->_sync->expects($this->once())->method('synchronize'); - $this->_requestMock->expects($this->any())->method('getFilePath')->will($this->returnValue($filePath)); - - $this->directoryReadMock->expects( - $this->once() - )->method( - 'getRelativePath' - )->with( - $filePath - )->will( - $this->returnValue($relativeFilePath) - ); - - $this->directoryReadMock->expects( - $this->once() - )->method( - 'isReadable' - )->with( - $relativeFilePath - )->will( - $this->returnValue(true) - ); - $this->_responseMock->expects($this->once())->method('setFilePath')->with($filePath); - $this->assertSame($this->_responseMock, $this->_model->launch()); + $filePath = '/absolute/path/to/test/file.png'; + $this->sync->expects($this->once())->method('synchronize')->with(self::RELATIVE_FILE_PATH); + $this->directoryMock->expects($this->once()) + ->method('isReadable') + ->with(self::RELATIVE_FILE_PATH) + ->will($this->returnValue(true)); + $this->directoryMock->expects($this->any()) + ->method('getAbsolutePath') + ->will($this->returnValueMap( + [ + [null, self::MEDIA_DIRECTORY], + [self::RELATIVE_FILE_PATH, $filePath], + ] + )); + $this->responseMock->expects($this->once())->method('setFilePath')->with($filePath); + $this->assertSame($this->responseMock, $this->model->launch()); } public function testProcessRequestReturnsNotFoundIfFileIsNotSynchronized() { - $this->_requestMock->expects( - $this->any() - )->method( - 'getPathInfo' - )->will( - $this->returnValue($this->_mediaDirectory . '/') - ); - $this->_sync->expects($this->once())->method('synchronize'); - $this->_requestMock->expects( - $this->any() - )->method( - 'getFilePath' - )->will( - $this->returnValue('non_existing_file_name') - ); - $this->_responseMock->expects($this->once())->method('setHttpResponseCode')->with(404); - $this->assertSame($this->_responseMock, $this->_model->launch()); + $this->sync->expects($this->once())->method('synchronize')->with(self::RELATIVE_FILE_PATH); + $this->directoryMock->expects($this->once()) + ->method('getAbsolutePath') + ->with() + ->will($this->returnValue(self::MEDIA_DIRECTORY)); + $this->directoryMock->expects($this->once()) + ->method('isReadable') + ->with(self::RELATIVE_FILE_PATH) + ->will($this->returnValue(false)); + $this->responseMock->expects($this->once())->method('setHttpResponseCode')->with(404); + $this->assertSame($this->responseMock, $this->model->launch()); } } diff --git a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/ConfigTest.php b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/ConfigTest.php index 77da8d96f34..33e9215f568 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/ConfigTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/ConfigTest.php @@ -50,7 +50,7 @@ class ConfigTest extends \PHPUnit_Framework_TestCase )->method( 'getDirectoryWrite' )->with( - DirectoryList::PUB + DirectoryList::ROOT )->will( $this->returnValue($directory) ); diff --git a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/Directory/DatabaseTest.php b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/Directory/DatabaseTest.php index 20478318e09..f9f55588c98 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/Directory/DatabaseTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/Directory/DatabaseTest.php @@ -192,4 +192,13 @@ class DatabaseTest extends \PHPUnit_Framework_TestCase $this->directoryDatabase->importDirectories('not an array'); } + + public function testSetGetConnectionName() + { + $this->assertSame($this->customConnectionName, $this->directoryDatabase->getConnectionName()); + $this->directoryDatabase->setConnectionName('test'); + $this->assertSame('test', $this->directoryDatabase->getConnectionName()); + $this->directoryDatabase->unsetData(); + $this->assertSame('test', $this->directoryDatabase->getConnectionName()); + } } diff --git a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/RequestTest.php b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/RequestTest.php index 8c4f374dce4..8ae7c41dd90 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/RequestTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/RequestTest.php @@ -17,11 +17,6 @@ class RequestTest extends \PHPUnit_Framework_TestCase */ protected $_requestMock; - /** - * @var string - */ - protected $_workingDir = '..var'; - /** * @var string */ @@ -32,7 +27,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase $path = '..PathInfo'; $this->_requestMock = $this->getMock('\Magento\Framework\App\Request\Http', [], [], '', false); $this->_requestMock->expects($this->once())->method('getPathInfo')->will($this->returnValue($path)); - $this->_model = new \Magento\MediaStorage\Model\File\Storage\Request($this->_workingDir, $this->_requestMock); + $this->_model = new \Magento\MediaStorage\Model\File\Storage\Request($this->_requestMock); } protected function tearDown() @@ -45,9 +40,4 @@ class RequestTest extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->_pathInfo, $this->_model->getPathInfo()); } - - public function testGetFilePath() - { - $this->assertEquals($this->_workingDir . '/' . $this->_pathInfo, $this->_model->getFilePath()); - } } diff --git a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/SynchronizationTest.php b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/SynchronizationTest.php index 8d43e4e281f..6d41dff21fa 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/SynchronizationTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/Model/File/Storage/SynchronizationTest.php @@ -5,18 +5,12 @@ */ namespace Magento\MediaStorage\Test\Unit\Model\File\Storage; -use Magento\Framework\App\Filesystem\DirectoryList; - class SynchronizationTest extends \PHPUnit_Framework_TestCase { - /** - * Test fir synchronize method - */ public function testSynchronize() { $content = 'content'; $relativeFileName = 'config.xml'; - $filePath = realpath(__DIR__ . '/_files/'); $storageFactoryMock = $this->getMock( 'Magento\MediaStorage\Model\File\Storage\DatabaseFactory', @@ -49,33 +43,13 @@ class SynchronizationTest extends \PHPUnit_Framework_TestCase $file->expects($this->once())->method('write')->with($content); $file->expects($this->once())->method('unlock'); $file->expects($this->once())->method('close'); - $directory = $this->getMock( - 'Magento\Framework\Filesystem\Direcoty\Write', - ['openFile', 'getRelativePath'], - [], - '', - false - ); - $directory->expects($this->once())->method('getRelativePath')->will($this->returnArgument(0)); - $directory->expects($this->once())->method('openFile')->with($filePath)->will($this->returnValue($file)); - $filesystem = $this->getMock( - 'Magento\Framework\Filesystem', - ['getDirectoryWrite'], - [], - '', - false - ); - $filesystem->expects( - $this->once() - )->method( - 'getDirectoryWrite' - )->with( - DirectoryList::PUB - )->will( - $this->returnValue($directory) - ); + $directory = $this->getMockForAbstractClass('Magento\Framework\Filesystem\Directory\WriteInterface'); + $directory->expects($this->once()) + ->method('openFile') + ->with($relativeFileName) + ->will($this->returnValue($file)); - $model = new \Magento\MediaStorage\Model\File\Storage\Synchronization($storageFactoryMock, $filesystem); - $model->synchronize($relativeFileName, $filePath); + $model = new \Magento\MediaStorage\Model\File\Storage\Synchronization($storageFactoryMock, $directory); + $model->synchronize($relativeFileName); } } 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 cfa0609a658..202ce994a75 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3643,4 +3643,5 @@ return [ ['Magento\Centinel\Test\TestCase\CentinelPaymentsInvalidCcTest'], ['Magento\Centinel\Test\TestCase\CentinelPaymentsValidCcTest'], ['Magento\Centinel\CreateOrderTest'], + ['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 2ed697e91c8..fee881bd8d2 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 @@ -2229,7 +2229,7 @@ return [ ['getIdentities', 'Magento\Sales\Block\Reorder\Sidebar'], ['assignData', 'Magento\OfflinePayments\Model\Checkmo'], ['timeShift', 'Magento\Reports\Model\Resource\Report\Collection'], - ['Magento\Catalog\Model\Product\Attribute\Backend\Startdate', 'Magento\Catalog\Model\Attribute\Backend\Startdate'], + ['getFilePath', 'Magento\MediaStorage\Model\File\Storage\Request'], ['_getStoreTimezoneUtcOffset', 'Magento\Reports\Model\Resource\Report\AbstractReport'], ['_dateToUtc', 'Magento\Reports\Model\Resource\Report\AbstractReport'], ]; diff --git a/pub/get.php b/pub/get.php index 68626e0a57e..9888d7627ac 100755 --- a/pub/get.php +++ b/pub/get.php @@ -8,13 +8,14 @@ use Magento\Framework\App\Cache\Frontend\Factory; use Magento\Framework\App\ObjectManagerFactory; +use Magento\Framework\HTTP\PhpEnvironment\Request; +use Magento\Framework\Stdlib\Cookie\PhpCookieReader; require dirname(__DIR__) . '/app/bootstrap.php'; $mediaDirectory = null; $allowedResources = []; -$configCacheFile = dirname(__DIR__) . '/var/resource_config.json'; -$relativeFilename = null; +$configCacheFile = BP . '/var/resource_config.json'; $isAllowed = function ($resource, array $allowedResources) { $isResourceAllowed = false; @@ -26,39 +27,39 @@ $isAllowed = function ($resource, array $allowedResources) { return $isResourceAllowed; }; +$request = new \Magento\MediaStorage\Model\File\Storage\Request(new Request(new PhpCookieReader())); +$relativePath = $request->getPathInfo(); if (file_exists($configCacheFile) && is_readable($configCacheFile)) { $config = json_decode(file_get_contents($configCacheFile), true); //checking update time if (filemtime($configCacheFile) + $config['update_time'] > time()) { - $mediaDirectory = trim(str_replace(__DIR__, '', $config['media_directory']), '/'); - $allowedResources = array_merge($allowedResources, $config['allowed_resources']); - } -} - -// Serve file if it's materialized -$request = new \Magento\MediaStorage\Model\File\Storage\Request(__DIR__); -if ($mediaDirectory) { - if (0 !== stripos($request->getPathInfo(), $mediaDirectory . '/') || is_dir($request->getFilePath())) { - header('HTTP/1.0 404 Not Found'); - exit; - } + $mediaDirectory = $config['media_directory']; + $allowedResources = $config['allowed_resources']; - $relativeFilename = str_replace($mediaDirectory . '/', '', $request->getPathInfo()); - if (!$isAllowed($relativeFilename, $allowedResources)) { - header('HTTP/1.0 404 Not Found'); - exit; - } - - if (is_readable($request->getFilePath())) { - $transfer = new \Magento\Framework\File\Transfer\Adapter\Http( - new \Magento\Framework\HTTP\PhpEnvironment\Response(), - new \Magento\Framework\File\Mime() - ); - $transfer->send($request->getFilePath()); - exit; + // Serve file if it's materialized + if ($mediaDirectory) { + if (!$isAllowed($relativePath, $allowedResources)) { + header('HTTP/1.0 404 Not Found'); + exit; + } + $mediaAbsPath = $mediaDirectory . '/' . $relativePath; + if (is_readable($mediaAbsPath)) { + if (is_dir($mediaAbsPath)) { + header('HTTP/1.0 404 Not Found'); + exit; + } + $transfer = new \Magento\Framework\File\Transfer\Adapter\Http( + new \Magento\Framework\HTTP\PhpEnvironment\Response(), + new \Magento\Framework\File\Mime() + ); + $transfer->send($mediaAbsPath); + exit; + } + } } } + // Materialize file in application $params = $_SERVER; if (empty($mediaDirectory)) { @@ -70,12 +71,10 @@ $bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params); $app = $bootstrap->createApplication( 'Magento\MediaStorage\App\Media', [ - 'request' => $request, - 'workingDirectory' => __DIR__, 'mediaDirectory' => $mediaDirectory, 'configCacheFile' => $configCacheFile, 'isAllowed' => $isAllowed, - 'relativeFileName' => $relativeFilename, + 'relativeFileName' => $relativePath, ] ); $bootstrap->run($app); -- GitLab From a570051cf0a0552db91be97bfa996ebf88ca4f33 Mon Sep 17 00:00:00 2001 From: Oleg Zinoviev <ozinoviev@ebay.com> Date: Tue, 9 Jun 2015 18:08:51 +0300 Subject: [PATCH 095/396] MAGETWO-38408: Customer account form is displayed broken --- app/design/frontend/Magento/blank/web/css/source/_forms.less | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 2e43d3ee29c..4af33708339 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; } -- GitLab From c35c7ce0f663f4b70b4bfeaf9534e726cd1aa095 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Tue, 9 Jun 2015 18:38:08 +0300 Subject: [PATCH 096/396] MAGETWO-38271: Extend API --- .../view/base/web/js/grid/columns/column.js | 31 ++-- .../js/grid/controls/bookmarks/bookmarks.js | 62 +++++-- .../web/js/grid/controls/bookmarks/view.js | 15 +- .../view/base/web/js/grid/controls/columns.js | 6 +- .../Magento/Ui/view/base/web/js/grid/dnd.js | 171 +++++++++--------- .../view/base/web/js/lib/component/manip.js | 21 ++- .../base/web/js/lib/ko/bind/after-render.js | 3 + .../base/web/templates/grid/dnd/listing.html | 2 +- .../view/base/web/templates/grid/listing.html | 2 +- lib/web/mage/utils/arrays.js | 69 +++---- lib/web/mage/utils/objects.js | 36 +++- lib/web/mage/utils/strings.js | 29 +++ lib/web/mage/utils/template.js | 41 +++-- 13 files changed, 306 insertions(+), 182 deletions(-) diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js index 901bb6c6c46..1eb359826b1 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/column.js @@ -17,8 +17,6 @@ define([ sorting: false, visible: true, draggable: true, - dragging: false, - dragover: false, links: { visible: '${ $.storageConfig.path }.visible', sorting: '${ $.storageConfig.path }.sorting' @@ -46,23 +44,24 @@ define([ return this; }, - applyState: function (property, state) { - var storage = this.storage(), - namespace = this.storageConfig.root + '.' + property, - data, - value; + /** + * Applies specified stored state of a column or one of its' properties. + * + * @param {String} state - Defines what state should be used: saved or default. + * @param {String} [property] - Defines what columns' property should be applied. + * If not specfied, than all collumns stored properties will be used. + * @returns {Column} Chainable. + */ + applyState: function (state, property) { + var namespace = this.storageConfig.root; - if (state === 'default') { - data = storage.getDefault(); - } else if (state === 'last') { - data = storage.getSaved(); + if (property) { + namespace += '.' + property; } - value = utils.nested(data, namespace); + this.storage('applyState', state, namespace); - if (!_.isUndefined(value)) { - this.set(property, value); - } + return this; }, /** @@ -113,7 +112,7 @@ define([ /** * Toggles sorting direcction. * - * @returns {String} + * @returns {String} New direction. */ toggleDirection: function () { return this.sorting() === 'asc' ? diff --git a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js index ba06ff4f75a..dd8f16498b3 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js @@ -12,6 +12,22 @@ define([ ], function (_, utils, registry, Storage, Collapsible, layout) { 'use strict'; + /** + * Removes 'current' namespace from a 'path' string. + * + * @param {String} path + * @returns {String} Path without namespace. + */ + function removeStateNs(path) { + path = typeof path == 'string' ? path.split('.') : ''; + + if (path[0] === 'current') { + path.shift(); + } + + return path.join('.'); + } + return Collapsible.extend({ defaults: { template: 'ui/grid/controls/bookmarks/bookmarks', @@ -236,6 +252,34 @@ define([ return this; }, + /** + * Applies specified views' data on a current data object. + * + * @param {String} state - Defines what state shultd be used: default or saved. + * @param {String} [path] - Path to the property whose value + * will be inserted to a current data object. + * @returns {Bookmarks} Chainable. + */ + applyState: function (state, path) { + var view, + value; + + view = state === 'default' ? + this.defaultView : + this.activeView(); + + path = removeStateNs(path); + value = view.getData(path); + + if (!_.isUndefined(value)) { + path = path ? 'current.' + path : 'current'; + + this.set(path, value); + } + + return this; + }, + /** * Saves current data state. * @@ -262,24 +306,6 @@ define([ return this; }, - /** - * Retrieves last saved data of a current view. - * - * @returns {Object} - */ - getSaved: function () { - return this.activeView().getData(); - }, - - /** - * Retrieves default data. - * - * @returns {Object} - */ - getDefault: function () { - return this.defaultView.getData(); - }, - /** * Defines default data if it wasn't gathered previously. * Assumes that if theres is no views available, diff --git a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/view.js b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/view.js index b42fedfe78d..afd5d4276de 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/view.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/view.js @@ -58,12 +58,19 @@ define([ }, /** - * Retrieves current data. + * Retrieves copied views' data. * - * @returns {Object} + * @param {String} [path] - Path to the specific property. + * @returns {*} */ - getData: function () { - return utils.copy(this.data.items); + getData: function (path) { + var data = this.data.items; + + if (path) { + data = utils.nested(data, path); + } + + return utils.copy(data); }, /** diff --git a/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js b/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js index 4782e7cde8a..765e4373342 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/controls/columns.js @@ -33,7 +33,7 @@ define([ * @returns {Columns} Chainable. */ reset: function () { - this.elems.each('applyState', 'visible', 'default'); + this.elems.each('applyState', 'default', 'visible'); return this; }, @@ -44,13 +44,13 @@ define([ * @returns {Columns} Chainable. */ cancel: function () { - this.elems.each('applyState', 'visible', 'last'); + this.elems.each('applyState', 'saved', 'visible'); return this; }, /** - * Extends child elements array with provided one. + * Adds columns whose visibility can be controlled to the component. * * @param {Array} columns - Elements array that will be added to component. * @returns {Columns} Chainable. diff --git a/app/code/Magento/Ui/view/base/web/js/grid/dnd.js b/app/code/Magento/Ui/view/base/web/js/grid/dnd.js index 383c50e031d..d1eb5ee827c 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/dnd.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/dnd.js @@ -52,8 +52,8 @@ define([ * Moves specified DOM element to the x and y coordinates. * * @param {HTMLElement} elem - Element to be relocated. - * @param {Number} x - Value on the 'x' axis. - * @param {Number} y - Value on the 'y' axis. + * @param {Number} x - X coordinate. + * @param {Number} y - Y coordinate. */ function locate(elem, x, y) { var value = 'translate(' + x + 'px,' + y + 'px)'; @@ -65,8 +65,8 @@ define([ /** * Checks if specified coordinate is inside of the provided area. * - * @param {Number} x - Value on the 'x' axis. - * @param {Number} y - Value on the 'y' axis. + * @param {Number} x - X coordinate. + * @param {Number} y - Y coordinate. * @param {Object} area - Object which represents area. * @returns {Boolean} */ @@ -155,7 +155,7 @@ define([ }, /** - * Makes specified column draggable. + * Sets specified column as a draggable element. * * @param {HTMLTableHeaderCellElement} column - Columns header element. * @returns {Dnd} Chainable. @@ -171,20 +171,25 @@ define([ }, /** + * Defines specified table element as a main container. + * * @param {HTMLTableElement} table * @returns {Dnd} Chainable. */ - addTable: function (table) { + setTable: function (table) { this.table = table; return this; }, /** + * Defines specified table element as a draggable table. + * Only this element will be moved across the screen. + * * @param {HTMLTableElement} dragTable * @returns {Dnd} Chainable. */ - addDragTable: function (dragTable) { + setDragTable: function (dragTable) { this.dragTable = dragTable; return this; @@ -265,8 +270,8 @@ define([ /** * Matches provided coordinates to available areas. * - * @param {Number} x - X coordinate. - * @param {Number} y - Y coordinate. + * @param {Number} x - X coordinate of a mouse pointer. + * @param {Number} y - Y coordinate of a mouse pointer. * @returns {Object|Undefined} Matched area. */ _getDropArea: function (x, y) { @@ -278,8 +283,8 @@ define([ /** * Updates state of hovered areas. * - * @param {Number} x - * @param {Number} y + * @param {Number} x - X coordinate of a mouse pointer. + * @param {Number} y - Y coordinate of a mouse pointer. */ _updateAreas: function (x, y) { var leavedArea = this.dropArea, @@ -294,10 +299,28 @@ define([ } }, + /** + * Grab action handler. + * + * @param {Number} x - X coordinate of a grabbed point. + * @param {Number} y - Y coordinate of a grabbed point. + * @param {HTMLElement} elem - Grabbed elemenet. + */ + grab: function (x, y, elem) { + this.initDrag = true; + this.grabbed = { + x: x, + y: y, + elem: elem + }; + + this.$body.addClass(this.noSelectClass); + }, + /** * Dragstart action handler. * - * @param {HTMLElement} elem - Element which is dragging. + * @param {HTMLTableHeaderCellElement} elem - Element which is dragging. */ dragstart: function (elem) { this.initDrag = false; @@ -313,114 +336,89 @@ define([ }, /** - * Dragend action handler. + * Drag action handler. Locates draggable + * grid at a specified coordinates. * - * @param {HTMLElement} elem - Element that was dragged. + * @param {Number} x - X coordinate. + * @param {Number} y - Y coordinate. */ - dragend: function (elem) { - var area = this.dropArea; - - this.$body.removeClass(this.noSelectClass); - - this.initDrag = false; + drag: function (x, y) { + var grabbed = this.grabbed, + dragArea = this.dragArea, + posX = x + grabbed.shiftX, + posY = y + grabbed.shiftY; - if (!this.dragging) { - return; + if (this.fixedX) { + x = dragArea.left; + posX = dragArea.orig.left; } - this.dragging = false; - - $(this.dragTable).addClass(this.hiddenClass); + if (this.fixedY) { + y = dragArea.top; + posY = dragArea.orig.top; + } - getModel(elem).dragging(false); + locate(this.dragTable, posX, posY); - if (area && area.target !== elem) { - this.drop(area.target, elem); + if (!isInside(x, y, this.dropArea)) { + this._updateAreas(x, y); } }, /** * Dragenter action handler. * - * @param {Object} area + * @param {Object} dropArea */ - dragenter: function (area) { - var elem = area.target, - drag = this.dragArea, - direction = drag.index < area.index ? 'left' : 'right'; + dragenter: function (dropArea) { + var direction = this.dragArea.index < dropArea.index ? + 'left' : + 'right'; - getModel(elem).dragover(direction); + getModel(dropArea.target).dragover(direction); }, /** * Dragleave action handler. * - * @param {Object} area + * @param {Object} dropArea */ - dragleave: function (area) { - getModel(area.target).dragover(false); + dragleave: function (dropArea) { + getModel(dropArea.target).dragover(false); }, /** - * Drop action handler. + * Dragend action handler. * - * @param {HTMLElement} target - * @param {HTMLElement} elem + * @param {Object} dragArea */ - drop: function (target, elem) { - target = getModel(target); - elem = getModel(elem); + dragend: function (dragArea) { + var dropArea = this.dropArea, + dragElem = dragArea.target; - getModel(this.table).insertChild(elem, target); - target.dragover(false); - }, - - /** - * Drag action handler. Locates draggable - * grid at a specified coordinates. - * - * @param {Number} x - X coordinate. - * @param {Number} y - Y coordinate. - */ - drag: function (x, y) { - var grabbed = this.grabbed, - dragArea = this.dragArea, - posX = x + grabbed.shiftX, - posY = y + grabbed.shiftY; - - if (this.fixedX) { - x = dragArea.left; - posX = dragArea.orig.left; - } + this.dragging = false; - if (this.fixedY) { - y = dragArea.top; - posY = dragArea.orig.top; - } + $(this.dragTable).addClass(this.hiddenClass); - locate(this.dragTable, posX, posY); + getModel(dragElem).dragging(false); - if (!isInside(x, y, this.dropArea)) { - this._updateAreas(x, y); + if (dropArea && dropArea.target !== dragElem) { + this.drop(dropArea, dragArea); } }, /** - * Grab action handler. + * Drop action handler. * - * @param {Number} x - Coordinate of a grabbed point on 'x' axis. - * @param {Number} y - Coordinate of a grabbed point on 'y' axis. - * @param {HTMLElement} target - Grabbed elemenet. + * @param {Object} dropArea + * @param {Object} dragArea */ - grab: function (x, y, target) { - this.initDrag = true; - this.grabbed = { - x: x, - y: y, - elem: target - }; + drop: function (dropArea, dragArea) { + var dropModel = getModel(dropArea.target), + dragModel = getModel(dragArea.target); - this.$body.addClass(this.noSelectClass); + getModel(this.table).insertChild(dragModel, dropModel); + dropModel.dragover(false); }, /** @@ -452,7 +450,12 @@ define([ */ onMouseUp: function () { if (this.initDrag || this.dragging) { - this.dragend(this.grabbed.elem); + this.initDrag = false; + this.$body.removeClass(this.noSelectClass); + } + + if (this.dragging) { + this.dragend(this.dragArea); } }, diff --git a/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js b/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js index 2d9f55d131d..a91b3cd38b6 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/component/manip.js @@ -57,19 +57,20 @@ define([ */ insertChild: function (elems, position) { var container = this._elems, + update = false, newItems = [], newItem; if (Array.isArray(elems)) { newItems = elems.map(function (item) { newItem = item.elem ? - utils.insert(item.elem, item.position, container) : - utils.insert(item, position, container); + utils.insert(item.elem, container, item.position) : + utils.insert(item, container, position); return newItem; }); } else { - newItems.push(utils.insert(elems, position, container)); + newItems.push(utils.insert(elems, container, position)); } newItems.forEach(function (item) { @@ -77,12 +78,18 @@ define([ return; } - _.isString(item) ? - registry.get(item, this._insert) : - this._insert(item); + if (item === true) { + update = true; + } else { + _.isString(item) ? + registry.get(item, this._insert) : + this._insert(item); + } }, this); - this._update(); + if (update) { + this._update(); + } return this; }, diff --git a/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js b/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js index 843372972e4..2297f2d5cf1 100644 --- a/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js +++ b/app/code/Magento/Ui/view/base/web/js/lib/ko/bind/after-render.js @@ -8,6 +8,9 @@ define([ 'use strict'; ko.bindingHandlers.afterRender = { + /** + * Binding init callback. + */ init: function (element, valueAccessor, allBindings, viewModel) { var callback = valueAccessor(); diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html b/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html index 54f79e76730..38b622cdef6 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/dnd/listing.html @@ -8,7 +8,7 @@ <table class="data-grid _dragging-copy _hidden" data-bind=" - afterRender: function (elem) { dnd('addDragTable', elem); } + afterRender: function (elem) { dnd('setDragTable', elem); } "> <thead data-part="head"> <tr data-part="head.row"> diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/listing.html b/app/code/Magento/Ui/view/base/web/templates/grid/listing.html index 439fa197360..118136c29fd 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/listing.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/listing.html @@ -9,7 +9,7 @@ class="data-grid" data-bind=" afterRender: dndConfig.enabled ? - function (elem) { dnd('addTable', elem); } : + function (elem) { dnd('setTable', elem); } : false, css: { 'data-grid-draggable': dndConfig.enabled diff --git a/lib/web/mage/utils/arrays.js b/lib/web/mage/utils/arrays.js index 71cdc5426dd..d931fc1c711 100644 --- a/lib/web/mage/utils/arrays.js +++ b/lib/web/mage/utils/arrays.js @@ -8,15 +8,22 @@ define([ ], function (_, utils) { 'use strict'; - function getIndex(elem, container) { - var index = container.indexOf(elem); + /** + * Defines index of an item in a specified container. + * + * @param {*} item - Item whose index should be defined. + * @param {Array} container - Container upon which to perform search. + * @returns {Number} + */ + function getIndex(item, container) { + var index = container.indexOf(item); if (~index) { return index; } - return _.findIndex(container, function (item) { - return item && (item.name === elem || item === elem); + return _.findIndex(container, function (value) { + return value && value.name === item; }); } @@ -75,21 +82,37 @@ define([ }, /** - * Extends an incoming array with a specified ammount of undefined values - * starting from a specified position. + * Compares multiple arrays without tracking order of their elements. * - * @param {Array} container - Array to be extended. - * @param {Number} size - Ammount of values to be added. - * @param {Number} [offset=0] - Position at which to start inserting values. - * @returns {Array} Modified array. + * @param {...Array} Multiple arrays to compare. + * @returns {Bollean} True if arrays are identical to each other. */ - reserve: function (container, size, offset) { - container.splice(offset || 0, 0, new Array(size)); + identical: function () { + var arrays = _.toArray(arguments), + first = arrays.shift(); - return _.flatten(container); + return arrays.every(function (arr) { + return arr.length === first.length && + !_.difference(arr, first).length; + }); }, - insert: function (item, position, container) { + /** + * Inserts specified item into container at specified position. + * + * @param {*} item - Item to be inserted into container. + * @param {Array} container - Container of items. + * @param {*} [position=-1] - Position at which item should be inserted. + * Position can represent: + * - specific index in container + * - item which might already be present in container + * - structure with one of these properties: after, before + * @returns {Boolean|*} + * - true if element has changed its' position + * - false if nothing has changed + * - inserted value if it wasn't present in container + */ + insert: function (item, container, position) { var currentIndex = getIndex(item, container), newIndex, target; @@ -128,23 +151,7 @@ define([ container.splice(newIndex, 0, item) : container[newIndex] = item; - return !~currentIndex ? item : false; - }, - - /** - * Compares multiple arrays without tracking order of their elements. - * - * @param {...Array} Multiple arrays to compare. - * @returns {Bollean} True if arrays are identical to each other. - */ - identical: function () { - var arrays = _.toArray(arguments), - first = arrays.shift(); - - return arrays.every(function (arr) { - return arr.length === first.length && - !_.difference(arr, first).length; - }); + return !~currentIndex ? item : currentIndex !== newIndex; }, formatOffset: function (elems, offset) { diff --git a/lib/web/mage/utils/objects.js b/lib/web/mage/utils/objects.js index 7cd4924e492..4aa5d7216c6 100644 --- a/lib/web/mage/utils/objects.js +++ b/lib/web/mage/utils/objects.js @@ -207,7 +207,12 @@ define([ return result; }, - extend: function (target) { + /** + * Performs deep extend of specified objects. + * + * @returns {Object|Array} Extended object. + */ + extend: function () { var args = _.toArray(arguments); args.unshift(true); @@ -215,15 +220,36 @@ define([ return $.extend.apply($, args); }, + /** + * Performs a deep clone of a specified object. + * + * @param {(Object|Array)} data - Data that should be copied. + * @returns {Object|Array} Cloned object. + */ copy: function (data) { - return this.extend({}, data); + var result = data, + isArray = Array.isArray(data), + placeholder; + + if (this.isObject(data) || isArray) { + placeholder = isArray ? [] : {}; + result = this.extend(placeholder, data); + } + + return result; }, - isObject: function (data) { + /** + * Checks if provided value is a plain object. + * + * @param {*} value - Value to be checked. + * @returns {Boolean} + */ + isObject: function (value) { var objProto = Object.prototype; - return typeof data == 'object' ? - objProto.toString.call(data) === '[object Object]' : + return typeof value == 'object' ? + objProto.toString.call(value) === '[object Object]' : false; } }; diff --git a/lib/web/mage/utils/strings.js b/lib/web/mage/utils/strings.js index 185951886aa..914ca72c1bd 100644 --- a/lib/web/mage/utils/strings.js +++ b/lib/web/mage/utils/strings.js @@ -7,7 +7,29 @@ define([ ], function (_) { 'use strict'; + var jsonRe = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/; + return { + /** + * Attempts to convert string to one of the primitive values, + * or to parse it as a valid json object. + * + * @param {String} str - String to be processed. + * @returns {*} + */ + castString: function (str) { + try { + str = str === 'true' ? true : + str === 'false' ? false : + str === 'null' ? null : + +str + '' === str ? +str : + jsonRe.test(str) ? JSON.parse(str) : + str; + } catch (e) {} + + return str; + }, + /** * Splits string by separator if it's possible, * otherwise returns the incoming value. @@ -62,6 +84,13 @@ define([ return value === '' || _.isUndefined(value) || _.isNull(value); }, + /** + * Adds 'prefix' to the 'part' value if it was provided. + * + * @param {String} prefix + * @param {String} part + * @returns {String} + */ fullPath: function (prefix, part) { return prefix ? prefix + '.' + part : part; } diff --git a/lib/web/mage/utils/template.js b/lib/web/mage/utils/template.js index e330661e4bd..d76f0e890f6 100644 --- a/lib/web/mage/utils/template.js +++ b/lib/web/mage/utils/template.js @@ -4,8 +4,9 @@ */ define([ 'underscore', - 'mage/utils/objects' -], function (_, utils) { + 'mage/utils/objects', + 'mage/utils/strings' +], function (_, utils, stringUtils) { 'use strict'; var tmplSettings = _.templateSettings, @@ -28,6 +29,7 @@ define([ })(); if (hasStringTmpls) { + /*eslint-disable no-unused-vars, no-eval*/ /** * Evaluates template string using ES6 templates. * @@ -38,6 +40,7 @@ define([ template = function (tmpl, $) { return eval('`' + tmpl + '`'); }; + /*eslint-enable no-unused-vars, no-eval*/ } else { /** * Fallback function used when ES6 templates are not supported. @@ -78,9 +81,12 @@ define([ * * @param {String} tmpl - Template string. * @param {Object} data - Data object used in a template. - * @returns {String} Compiled template. + * @param {Boolean} [castString=false] - Flag that indicates whether template + * should be casted after evaluation to a value of another type or + * that it should be leaved as a string. + * @returns {*} Compiled template. */ - function render(tmpl, data) { + function render(tmpl, data, castString) { var last = tmpl; data = Object.create(data); @@ -95,7 +101,9 @@ define([ last = tmpl; } - return tmpl; + return castString ? + stringUtils.castString(tmpl) : + tmpl; } return { @@ -104,7 +112,10 @@ define([ * * @param {Object|String} tmpl * @param {Object} [data] - Data object to match with template. - * @returns {Object|String} + * @param {Boolean} [castString=false] - Flag that indicates whether template + * should be casted after evaluation to a value of another type or + * that it should be leaved as a string. + * @returns {*} * * @example Template defined as a string. * var source = { foo: 'Random Stuff', bar: 'Some' }; @@ -130,16 +141,20 @@ define([ * baz: 'Upper BAR' * }; */ - template: function (tmpl, data) { + template: function (tmpl, data, castString) { + var iterate; + if (typeof tmpl === 'string') { - return render(tmpl, data); + return render(tmpl, data, castString); } tmpl = utils.copy(tmpl); - tmpl.$data = data || {}; - _.each(tmpl, function iterate(value, key, list) { + /** + * Template iterator function. + */ + iterate = function (value, key, list) { if (key === '$data') { return; } @@ -152,11 +167,13 @@ define([ } if (isTemplate(value)) { - list[key] = render(value, tmpl); + list[key] = render(value, tmpl, castString); } else if (utils.isObject(value) || Array.isArray(value)) { _.each(value, iterate); } - }); + }; + + _.each(tmpl, iterate); delete tmpl.$data; -- GitLab From 961b3d3a2c573cee212b22437bd0d0914b8ab2e2 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Tue, 9 Jun 2015 20:24:58 +0300 Subject: [PATCH 097/396] MAGNSWTC-42: Resolve naming issue for descendent classes --- app/code/Magento/Catalog/Block/Product/AbstractProduct.php | 2 +- .../Magento/Catalog/view/frontend/templates/product/list.phtml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php index dcab87ec01a..016866f4f1a 100644 --- a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php +++ b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php @@ -605,7 +605,7 @@ class AbstractProduct extends \Magento\Framework\View\Element\Template * @param \Magento\Catalog\Model\Product $product * @return mixed */ - public function getDetailsHtml(\Magento\Catalog\Model\Product $product) + public function getProductDetailsHtml(\Magento\Catalog\Model\Product $product) { $renderer = $this ->getDetailsRenderer($product->getTypeId()) 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 98daed2a026..c376d81d7fa 100644 --- a/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml +++ b/app/code/Magento/Catalog/view/frontend/templates/product/list.phtml @@ -69,7 +69,7 @@ $imageBlock = $block->getLayout()->createBlock('Magento\Catalog\Block\Product\I </strong> <?php echo $block->getReviewsSummaryHtml($_product, $templateType); ?> <?php echo $block->getProductPrice($_product) ?> - <?php echo $block->getDetailsHtml($_product); ?> + <?php echo $block->getProductDetailsHtml($_product); ?> <div class="product-item-inner"> <div class="product actions product-item-actions"<?php echo strpos($pos, $viewMode . '-actions') ? $position : ''; ?>> -- GitLab From 4fc723ee77724baab108eeb95785649f773feb3a Mon Sep 17 00:00:00 2001 From: Olga Kopylova <okopylova@ebay.com> Date: Tue, 9 Jun 2015 10:23:12 -0500 Subject: [PATCH 098/396] MAGETWO-37894: Images can't be loaded if using separate Media Storage and disabled Webserver rewrites - fixed code style --- app/code/Magento/MediaStorage/App/Media.php | 9 ++++++--- .../MediaStorage/Test/Unit/App/MediaTest.php | 18 +++++++++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/code/Magento/MediaStorage/App/Media.php b/app/code/Magento/MediaStorage/App/Media.php index 8c4370f05f3..a3c9c3bd3b0 100644 --- a/app/code/Magento/MediaStorage/App/Media.php +++ b/app/code/Magento/MediaStorage/App/Media.php @@ -15,6 +15,9 @@ use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\AppInterface; use Magento\MediaStorage\Model\File\Storage\SynchronizationFactory; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class Media implements AppInterface { /** @@ -46,12 +49,12 @@ class Media implements AppInterface private $relativeFileName; /** - * @var \Magento\MediaStorage\Model\File\Storage\Response + * @var Response */ private $response; /** - * @var \Magento\Framework\Filesystem\Directory\Read $directory + * @var \Magento\Framework\Filesystem\Directory\WriteInterface */ private $directory; @@ -101,7 +104,7 @@ class Media implements AppInterface /** * Run application * - * @return \Magento\Framework\App\ResponseInterface + * @return Response * @throws \LogicException */ public function launch() diff --git a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php index acc2b3f91a1..7dbdc441584 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php @@ -65,11 +65,23 @@ class MediaTest extends \PHPUnit_Framework_TestCase }; $this->configMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\Config', [], [], '', false); $this->sync = $this->getMock('Magento\MediaStorage\Model\File\Storage\Synchronization', [], [], '', false); - $this->configFactoryMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\ConfigFactory', [], [], '', false); + $this->configFactoryMock = $this->getMock( + 'Magento\MediaStorage\Model\File\Storage\ConfigFactory', + [], + [], + '', + false + ); $this->configFactoryMock->expects($this->any()) ->method('create') ->will($this->returnValue($this->configMock)); - $this->syncFactoryMock = $this->getMock('Magento\MediaStorage\Model\File\Storage\SynchronizationFactory', [], [], '', false); + $this->syncFactoryMock = $this->getMock( + 'Magento\MediaStorage\Model\File\Storage\SynchronizationFactory', + [], + [], + '', + false + ); $this->syncFactoryMock->expects($this->any()) ->method('create') ->will($this->returnValue($this->sync)); @@ -119,7 +131,7 @@ class MediaTest extends \PHPUnit_Framework_TestCase ->will($this->returnValueMap( [ [null, self::MEDIA_DIRECTORY], - [self::RELATIVE_FILE_PATH, $filePath], + [self::RELATIVE_FILE_PATH, $filePath], ] )); $this->configMock->expects($this->once())->method('save'); -- GitLab From 821a5b084e2dbfbb2bf3f75110411d3a67c3e438 Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Wed, 10 Jun 2015 11:53:35 +0300 Subject: [PATCH 099/396] MAGETWO-38254: Extend Ui/modal to support invoke without element --- lib/web/css/source/components/_modals.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/css/source/components/_modals.less b/lib/web/css/source/components/_modals.less index 2ded40e1cd6..ee3a67ca534 100644 --- a/lib/web/css/source/components/_modals.less +++ b/lib/web/css/source/components/_modals.less @@ -28,7 +28,7 @@ @modal-slide-header__padding-vertical: 2.1rem; -@modal-popup-alert__width: 50rem; +@modal-popup-confirm__width: 50rem; // // Utilities -- GitLab From d7285c5ceb1e20a88fbff39c6cc65199b95c41da Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Wed, 10 Jun 2015 13:15:52 +0300 Subject: [PATCH 100/396] MAGETWO-38254: Extend Ui/modal to support invoke without element --- lib/web/css/source/components/_modals.less | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web/css/source/components/_modals.less b/lib/web/css/source/components/_modals.less index ee3a67ca534..df5c973eef2 100644 --- a/lib/web/css/source/components/_modals.less +++ b/lib/web/css/source/components/_modals.less @@ -185,9 +185,9 @@ } &.confirm { .modal-inner-wrap { - margin-left: -(@modal-popup-alert__width/2); + margin-left: -(@modal-popup-confirm__width/2); left: 50%; - width: @modal-popup-alert__width; + width: @modal-popup-confirm__width; } .modal-footer { text-align: right; -- GitLab From eb37216d24bb313cfb7782fc263def43130ead78 Mon Sep 17 00:00:00 2001 From: Olga Kopylova <okopylova@ebay.com> Date: Wed, 10 Jun 2015 08:37:32 -0500 Subject: [PATCH 101/396] MAGETWO-37894: Images can't be loaded if using separate Media Storage and disabled Webserver rewrites - fixed unit tests --- app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php index 7dbdc441584..0dd09b909a7 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php @@ -67,7 +67,7 @@ class MediaTest extends \PHPUnit_Framework_TestCase $this->sync = $this->getMock('Magento\MediaStorage\Model\File\Storage\Synchronization', [], [], '', false); $this->configFactoryMock = $this->getMock( 'Magento\MediaStorage\Model\File\Storage\ConfigFactory', - [], + ['create'], [], '', false @@ -77,7 +77,7 @@ class MediaTest extends \PHPUnit_Framework_TestCase ->will($this->returnValue($this->configMock)); $this->syncFactoryMock = $this->getMock( 'Magento\MediaStorage\Model\File\Storage\SynchronizationFactory', - [], + ['create'], [], '', false -- GitLab From 2dd09e2658729f84ec53760504cfd0b657afa397 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 10 Jun 2015 17:21:51 +0300 Subject: [PATCH 102/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../Model/Import/Product/Option.php | 27 ++++++++++++------- .../Magento/Checkout/Model/Type/Onepage.php | 2 +- .../Contact/view/email/submitted_form.html | 2 +- .../Api/AccountManagementInterface.php | 4 +-- .../Controller/Account/CreatePost.php | 2 +- .../Customer/Model/AccountManagement.php | 4 ++- .../Customer/view/email/account_new.html | 4 +-- .../view/email/account_new_confirmation.html | 6 ++--- .../view/email/account_new_confirmed.html | 2 +- .../Model/Export/Address.php | 2 +- .../Resource/Import/Customer/Storage.php | 2 +- .../Fedex/etc/wsdl/RateService_v10.wsdl | 14 +++++----- .../Fedex/etc/wsdl/RateService_v9.wsdl | 14 +++++----- .../Fedex/etc/wsdl/ShipService_v10.wsdl | 14 +++++----- .../Fedex/etc/wsdl/ShipService_v9.wsdl | 14 +++++----- .../Test/Unit/Model/MassOperationsTest.php | 15 ++++++----- .../Unit/Model/AuthorizationServiceTest.php | 2 +- .../TestCase/ForgotPasswordOnFrontendTest.php | 2 +- .../Test/Constraint/AssertSuccessInstall.php | 2 +- .../Customer/Controller/AccountTest.php | 2 +- .../Customer/Model/AccountManagementTest.php | 6 ++--- .../Email/Model/Template/FilterTest.php | 8 +++--- .../templates/sample_email_content.phtml | 2 +- .../layout/email_template_test_handle.xml | 2 +- .../templates/sample_email_content.phtml | 2 +- .../sample_email_content_custom.phtml | 2 +- .../Framework/Validator/EmailAddress.php | 2 +- pub/errors/processor.php | 2 +- setup/pub/angular/angular.js | 2 +- .../magento/setup/create-admin-account.phtml | 8 +++--- setup/view/magento/setup/success.phtml | 2 +- 31 files changed, 94 insertions(+), 80 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php index 750e033865b..93b6e77fe22 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php @@ -371,33 +371,42 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity protected function _initMessageTemplates() { // @codingStandardsIgnoreStart - $this->_productEntity->addMessageTemplate(self::ERROR_INVALID_STORE, __('Please correct the value for store.')); - $this->_productEntity->addMessageTemplate(self::ERROR_INVALID_TYPE, __('Please correct the value for type.')); + $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 correct the value for price.')); + $this->_productEntity->addMessageTemplate( + self::ERROR_INVALID_PRICE, + __('Please enter a correct value for "price".') + ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_MAX_CHARACTERS, - __('Please correct the value for maximum characters value.') + __('Please enter a correct value for "maximum characters".') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_SORT_ORDER, - __('Please correct the value for sort order.') + __('Please enter a correct value for "sort order".') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_PRICE, - __('Please correct the value for value price.') + __('Please enter a correct value for "value price".') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_SORT, - __('Please correct the value for value sort order.') + __('Please enter a correct value for "sort order".') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_NEW_NAMES, - __('A custom option with this title already exists in source file.') + __('This name is already being used. Please enter a different name.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_OLD_NAMES, - __('Several custom options with this name already exist.') + __('This name is already being used. Please enter a different name.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_TYPES, diff --git a/app/code/Magento/Checkout/Model/Type/Onepage.php b/app/code/Magento/Checkout/Model/Type/Onepage.php index b8610f26fc9..dae0433f518 100644 --- a/app/code/Magento/Checkout/Model/Type/Onepage.php +++ b/app/code/Magento/Checkout/Model/Type/Onepage.php @@ -909,7 +909,7 @@ class Onepage $this->messageManager->addSuccess( // @codingStandardsIgnoreStart __( - 'You must confirm your account. Please check your e-mail for the confirmation link or <a href="%1">click here</a> for a new link.', + '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/Contact/view/email/submitted_form.html b/app/code/Magento/Contact/view/email/submitted_form.html index 639924aaaef..5bff540b55d 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/Customer/Api/AccountManagementInterface.php b/app/code/Magento/Customer/Api/AccountManagementInterface.php index 3a686695721..afd19537fd4 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/Controller/Account/CreatePost.php b/app/code/Magento/Customer/Controller/Account/CreatePost.php index f2f4fc6a687..bad09bdeff3 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( __( - 'You must confirm your account. Please check your e-mail for the confirmation link or <a href="%1">click here</a> for a new link.', + '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 ) ); diff --git a/app/code/Magento/Customer/Model/AccountManagement.php b/app/code/Magento/Customer/Model/AccountManagement.php index 7cfcf9f9035..faa64b8140b 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) { diff --git a/app/code/Magento/Customer/view/email/account_new.html b/app/code/Magento/Customer/view/email/account_new.html index d49f91c3b27..86344c09ced 100644 --- a/app/code/Magento/Customer/view/email/account_new.html +++ b/app/code/Magento/Customer/view/email/account_new.html @@ -33,10 +33,10 @@ 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 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 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 sign in:<br/> - <strong>E-mail</strong>: {{var customer.email}}<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> 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 9eb2f61ebe4..501f45ed0f8 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 sign 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 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="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 sign in:<br/> - <strong>E-mail:</strong> {{var customer.email}}<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 094102911e6..e6b7f3e9379 100644 --- a/app/code/Magento/Customer/view/email/account_new_confirmed.html +++ b/app/code/Magento/Customer/view/email/account_new_confirmed.html @@ -33,7 +33,7 @@ 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 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 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;">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> diff --git a/app/code/Magento/CustomerImportExport/Model/Export/Address.php b/app/code/Magento/CustomerImportExport/Model/Export/Address.php index bfe77d3e13c..539cca19721 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/Resource/Import/Customer/Storage.php b/app/code/Magento/CustomerImportExport/Model/Resource/Import/Customer/Storage.php index 1b631046334..36b9c38a16a 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/Fedex/etc/wsdl/RateService_v10.wsdl b/app/code/Magento/Fedex/etc/wsdl/RateService_v10.wsdl index 71d40621665..6ae04ccee07 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 6cc5074785a..efbf75076c2 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 6f19ffa115d..6c43af98ef6 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 d2a670661dd..8c11a5f6603 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/GoogleShopping/Test/Unit/Model/MassOperationsTest.php b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php index aa66f7a7431..4d9eb271e5e 100644 --- a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php +++ b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php @@ -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)); @@ -193,7 +193,10 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addMajor') ->with( 'Something went wrong during synchronization with Google Shopping.', - ['We can\'t update 1 items.', 'The item "Product Name" hasn\'t been updated.'] + [ + __('We cannot update %1 items.', [1]), + __('We can\'t update item "%1" right now.',[$item->getProduct()->getName()]), + ] )->will($this->returnSelf()); $this->massOperations->synchronizeItems([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'))); @@ -251,7 +254,7 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase $this->notificationInterface->expects($this->once())->method('addMajor') ->with( 'Something went wrong while deleting items from Google Shopping.', - ['The item "Product Name" hasn\'t been deleted.'] + [__('We can\'t update item "%1" right now.', [$item->getProduct()->getName()])] )->will($this->returnSelf()); $this->massOperations->deleteItems([1]); } diff --git a/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php b/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php index 77df24ca983..fc0ee3e4fb0 100644 --- a/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php +++ b/app/code/Magento/Integration/Test/Unit/Model/AuthorizationServiceTest.php @@ -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/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.php index 8e961286ee4..e9eadb198a5 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/Install/Test/Constraint/AssertSuccessInstall.php b/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php index 07ce519b594..8fffdaaf428 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' => 'web'], ['pageData' => 'magento_admin_address', 'fixture' => 'admin'] ]; diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index 89836b613ad..b53637f8418 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -194,7 +194,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController $this->assertRedirect($this->stringContains('customer/account/index/')); $this->assertSessionMessages( $this->equalTo([ - 'You must confirm your account. Please check your e-mail for the confirmation link or ' + '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.' ]), diff --git a/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php b/dev/tests/integration/testsuite/Magento/Customer/Model/AccountManagementTest.php index 343285af8d7..9e44c6b7339 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); } 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 06746a974e5..58db3fe5b81 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/_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 545dc82c315..3b4b3ace449 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 767644707ff..5d5eeba0a63 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 6c448d817c6..7ba93b3a047 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 01ca668c1b3..42fc2b23ebf 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/lib/internal/Magento/Framework/Validator/EmailAddress.php b/lib/internal/Magento/Framework/Validator/EmailAddress.php index 7420debc7f8..5a310f18775 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/pub/errors/processor.php b/pub/errors/processor.php index 7a25b8ee1f5..94416418f42 100755 --- a/pub/errors/processor.php +++ b/pub/errors/processor.php @@ -520,7 +520,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 66b1d2569b7..f53b5280f86 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/view/magento/setup/create-admin-account.phtml b/setup/view/magento/setup/create-admin-account.phtml index cb6b54e2c63..3af89b8a2cd 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 f0c2867f9b7..f894c1bec82 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> -- GitLab From 68f8904a2edab19ac07b2a17168d38001f81c8ad Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 10 Jun 2015 17:47:25 +0300 Subject: [PATCH 103/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../Model/Import/Product/Option.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php index 93b6e77fe22..140db08736a 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php @@ -373,32 +373,32 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity // @codingStandardsIgnoreStart $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_STORE, - __('Please enter a correct value for "store".') + __('Please enter a correct value for "store."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_TYPE, - __('Please enter a correct value for "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".') + __('Please enter a correct value for "price."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_MAX_CHARACTERS, - __('Please enter a correct value for "maximum characters".') + __('Please enter a correct value for "maximum characters."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_SORT_ORDER, - __('Please enter a correct value for "sort order".') + __('Please enter a correct value for "sort order."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_PRICE, - __('Please enter a correct value for "value price".') + __('Please enter a correct value for "value price."') ); $this->_productEntity->addMessageTemplate( self::ERROR_INVALID_ROW_SORT, - __('Please enter a correct value for "sort order".') + __('Please enter a correct value for "sort order."') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_NEW_NAMES, -- GitLab From 025e430150b9d2dd545df3c4cca208023402bba7 Mon Sep 17 00:00:00 2001 From: Alexandr Skrashuk <Alexandr_Skrashuk@epam.com> Date: Wed, 10 Jun 2015 18:14:51 +0300 Subject: [PATCH 104/396] MAGNSWTCH-118: unittest - fix for additional construct incoming params --- .../Unit/Model/SuggestedAttributeListTest.php | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/SuggestedAttributeListTest.php b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/SuggestedAttributeListTest.php index cf9344a03bb..72ee3478330 100644 --- a/app/code/Magento/ConfigurableProduct/Test/Unit/Model/SuggestedAttributeListTest.php +++ b/app/code/Magento/ConfigurableProduct/Test/Unit/Model/SuggestedAttributeListTest.php @@ -20,6 +20,16 @@ class SuggestedAttributeListTest extends \PHPUnit_Framework_TestCase */ protected $attributeFactoryMock; + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $eventManagerMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $objectFactoryMock; + /** * @var \PHPUnit_Framework_MockObject_MockObject */ @@ -53,6 +63,20 @@ class SuggestedAttributeListTest extends \PHPUnit_Framework_TestCase '', false ); + $this->eventManagerMock = $this->getMock( + '\Magento\Framework\Event\ManagerInterface', + [], + [], + '', + false + ); + $this->objectFactoryMock = $this->getMock( + '\Magento\Framework\ObjectFactory', + ['create'], + [], + '', + false + ); $this->collectionMock = $this->getMock( 'Magento\Catalog\Model\Resource\Product\Attribute\Collection', [], @@ -78,7 +102,7 @@ class SuggestedAttributeListTest extends \PHPUnit_Framework_TestCase $this->returnValue($this->collectionMock) ); $valueMap = [ - ['frontend_input', 'select', $this->collectionMock], + ['main_table.frontend_input', ['in' => 123 ], $this->collectionMock], ['frontend_label', ['like' => $this->labelPart], $this->collectionMock], ['is_user_defined', 1, $this->collectionMock], ['is_global', \Magento\Catalog\Model\Resource\Eav\Attribute::SCOPE_GLOBAL, $this->collectionMock], @@ -107,12 +131,19 @@ class SuggestedAttributeListTest extends \PHPUnit_Framework_TestCase ); $this->suggestedListModel = new \Magento\ConfigurableProduct\Model\SuggestedAttributeList( $this->attributeFactoryMock, - $this->resourceHelperMock + $this->resourceHelperMock, + $this->eventManagerMock, + $this->objectFactoryMock ); } public function testGetSuggestedAttributesIfTheyApplicable() { + $object = $this->getMock('\Magento\Framework\Object', [], [], '', false); + $object->expects($this->once())->method('setData'); + $object->expects($this->once())->method('getData')->willReturn(123); + $this->objectFactoryMock->expects($this->once())->method('create')->willReturn($object); + $source = $this->getMock( 'Magento\Eav\Model\Entity\Attribute\Source\AbstractSource', [], @@ -132,6 +163,10 @@ class SuggestedAttributeListTest extends \PHPUnit_Framework_TestCase public function testGetSuggestedAttributesIfTheyNotApplicable() { + $object = $this->getMock('\Magento\Framework\Object', [], [], '', false); + $object->expects($this->once())->method('setData'); + $object->expects($this->once())->method('getData')->willReturn(123); + $this->objectFactoryMock->expects($this->once())->method('create')->willReturn($object); $this->attributeMock->expects($this->any())->method('getApplyTo')->will($this->returnValue(['simple'])); $this->attributeMock->expects($this->never())->method('getId'); $this->attributeMock->expects($this->never())->method('getFrontendLabel'); -- GitLab From ae6b737de182ff9d39793fbf750e9b7362d8aa76 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 10 Jun 2015 18:22:06 +0300 Subject: [PATCH 105/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../GoogleShopping/Test/Unit/Model/MassOperationsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php index 4d9eb271e5e..12eb035b167 100644 --- a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php +++ b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php @@ -195,7 +195,7 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase 'Something went wrong during synchronization with Google Shopping.', [ __('We cannot update %1 items.', [1]), - __('We can\'t update item "%1" right now.',[$item->getProduct()->getName()]), + __('We can\'t update item "%1" right now.', [$item->getProduct()->getName()]), ] )->will($this->returnSelf()); $this->massOperations->synchronizeItems([1]); -- GitLab From 8bd7f9a26b6e82fc7f083ee64906ecfe1a4b8539 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 10 Jun 2015 18:27:49 +0300 Subject: [PATCH 106/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- app/code/Magento/Customer/Model/Customer.php | 2 +- app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Customer/Model/Customer.php b/app/code/Magento/Customer/Model/Customer.php index 6e64ec2fc08..8bdf0bc3397 100644 --- a/app/code/Magento/Customer/Model/Customer.php +++ b/app/code/Magento/Customer/Model/Customer.php @@ -1034,7 +1034,7 @@ class Customer extends \Magento\Framework\Model\AbstractModel } $attribute = $this->_config->getAttribute($entityType, 'gender'); if ($attribute->getIsRequired() && '' == trim($this->getGender())) { - $errors[] = __('Please enter a gender value.'); + $errors[] = __('Please enter a gender.'); } $transport = new \Magento\Framework\Object( diff --git a/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php b/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php index ca722c837c1..a1a684f9c71 100644 --- a/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php +++ b/app/code/Magento/Customer/Test/Unit/Model/CustomerTest.php @@ -173,7 +173,7 @@ class CustomerTest extends \PHPUnit_Framework_TestCase ], [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 value.']], + [array_diff_key($data, ['gender' => '']), ['Please enter a gender.']], [$data, true], ]; } -- GitLab From b329028a331cbfb02be15b3da56e348078ce8862 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 10 Jun 2015 18:38:24 +0300 Subject: [PATCH 107/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- app/code/Magento/GoogleShopping/Model/MassOperations.php | 2 +- .../GoogleShopping/Test/Unit/Model/MassOperationsTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/GoogleShopping/Model/MassOperations.php b/app/code/Magento/GoogleShopping/Model/MassOperations.php index b7fd743a2f2..3be591c6e1a 100644 --- a/app/code/Magento/GoogleShopping/Model/MassOperations.php +++ b/app/code/Magento/GoogleShopping/Model/MassOperations.php @@ -292,7 +292,7 @@ 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( __('Something went wrong during synchronization with Google Shopping.'), $errors diff --git a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php index 12eb035b167..836e23c97f1 100644 --- a/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php +++ b/app/code/Magento/GoogleShopping/Test/Unit/Model/MassOperationsTest.php @@ -194,7 +194,7 @@ class MassOperationsTest extends \PHPUnit_Framework_TestCase ->with( 'Something went wrong during synchronization with Google Shopping.', [ - __('We cannot update %1 items.', [1]), + __('We can\'t update %1 item(s).', [1]), __('We can\'t update item "%1" right now.', [$item->getProduct()->getName()]), ] )->will($this->returnSelf()); -- GitLab From f72fa7f3a485e23331cade1b487157661b41a4ca Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Wed, 10 Jun 2015 19:30:50 +0300 Subject: [PATCH 108/396] MAGETWO-38526: Implement API services for Magento\GiftMessage --- .../Api/GuestCartRepositoryInterface.php | 33 +++ .../Api/GuestItemRepositoryInterface.php | 36 +++ .../GiftMessage/Model/CartRepository.php | 2 +- .../GiftMessage/Model/GiftMessageManager.php | 10 - .../GiftMessage/Model/GuestCartRepository.php | 61 +++++ .../GiftMessage/Model/GuestItemRepository.php | 61 +++++ .../GiftMessage/Model/ItemRepository.php | 2 +- .../Plugin/TotalsDataProcessorPlugin.php | 64 ----- .../Unit/Model/GiftMessageManagerTest.php | 55 ----- .../Unit/Model/GuestCartRepositoryTest.php | 120 ++++++++++ .../Unit/Model/GuestItemRepositoryTest.php | 224 ++++++++++++++++++ app/code/Magento/GiftMessage/etc/di.xml | 5 +- .../etc/service_data_attributes.xml | 7 - app/code/Magento/GiftMessage/etc/webapi.xml | 65 +++++ .../GiftMessage/Api/CartRepositoryTest.php | 82 +++++++ .../Api/GuestCartRepositoryTest.php | 119 ++++++++++ .../Api/GuestItemRepositoryTest.php | 129 ++++++++++ .../GiftMessage/Api/ItemRepositoryTest.php | 92 +++++++ .../quote_with_customer_and_message.php | 40 ++++ ...ote_with_customer_and_message_rollback.php | 18 ++ .../_files/quote_with_item_message.php | 8 + .../GiftMessage/_files/quote_with_message.php | 8 + 22 files changed, 1100 insertions(+), 141 deletions(-) create mode 100644 app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php create mode 100644 app/code/Magento/GiftMessage/Api/GuestItemRepositoryInterface.php create mode 100644 app/code/Magento/GiftMessage/Model/GuestCartRepository.php create mode 100644 app/code/Magento/GiftMessage/Model/GuestItemRepository.php delete mode 100644 app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php create mode 100644 app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php create mode 100644 app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php create mode 100644 dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php create mode 100644 dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php create mode 100644 dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message.php create mode 100644 dev/tests/integration/testsuite/Magento/GiftMessage/_files/quote_with_customer_and_message_rollback.php diff --git a/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php b/app/code/Magento/GiftMessage/Api/GuestCartRepositoryInterface.php new file mode 100644 index 00000000000..93973b139a2 --- /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 00000000000..31ce48c0907 --- /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/Model/CartRepository.php b/app/code/Magento/GiftMessage/Model/CartRepository.php index 4fe6b988236..7cb8058bfb2 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/GiftMessageManager.php b/app/code/Magento/GiftMessage/Model/GiftMessageManager.php index bba98363c7d..b230fb2c40c 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 00000000000..b27513fc355 --- /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 00000000000..d46ed3c5589 --- /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 d7220d2516f..cead9782a4e 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 9d26c0a38b4..00000000000 --- a/app/code/Magento/GiftMessage/Model/Plugin/TotalsDataProcessorPlugin.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\GiftMessage\Model\Plugin; - -use Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor; -use Magento\Quote\Api\Data\TotalsAdditionalDataInterface; - -/** - * Shopping cart gift message item repository object. - */ -class TotalsDataProcessorPlugin -{ - /** - * @var \Magento\GiftMessage\Api\CartRepositoryInterface - */ - protected $cartRepository; - - /** - * @var \Magento\GiftMessage\Api\ItemRepositoryInterface - */ - protected $itemRepositoryInterface; - - /** - * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository - * @param \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository - */ - public function __construct( - \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository, - \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository - ) { - $this->cartRepository = $cartRepository; - $this->itemRepositoryInterface = $itemRepository; - } - - /** - * Set gift messages from additional data. - * - * @param \Magento\Quote\Model\Cart\TotalsAdditionalDataProcessor $subject - * @param TotalsAdditionalDataInterface $additionalData - * @param int $cartId - * @return void - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function beforeProcess( - TotalsAdditionalDataProcessor $subject, - TotalsAdditionalDataInterface $additionalData, - $cartId - ) { - $giftMessages = $additionalData->getExtensionAttributes()->getGiftMessages(); - foreach ($giftMessages as $giftMessage) { - /** @var \Magento\GiftMessage\Api\Data\MessageInterface $giftMessage */ - $entityType = $giftMessage->getExtensionAttributes()->getEntityType(); - $entityId = $giftMessage->getExtensionAttributes()->getEntityId(); - if ($entityType === 'quote') { - $this->cartRepository->save($cartId, $giftMessage); - } elseif ($entityType === 'item') { - $this->itemRepositoryInterface->save($cartId, $giftMessage, $entityId); - } - } - } -} diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GiftMessageManagerTest.php index e44dca6dec3..e578198b121 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 00000000000..f35fa39c514 --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php @@ -0,0 +1,120 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\GiftMessage\Test\Unit\Model; + +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 GuestItemRepositoryTest 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 00000000000..4bbbbf7edca --- /dev/null +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php @@ -0,0 +1,224 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\GiftMessage\Test\Unit\Model; + +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/etc/di.xml b/app/code/Magento/GiftMessage/etc/di.xml index 6d3a903c680..47a6c71f15a 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/service_data_attributes.xml b/app/code/Magento/GiftMessage/etc/service_data_attributes.xml index bc8a926dfb8..f02c0a717e1 100644 --- a/app/code/Magento/GiftMessage/etc/service_data_attributes.xml +++ b/app/code/Magento/GiftMessage/etc/service_data_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/app/code/Magento/GiftMessage/etc/webapi.xml b/app/code/Magento/GiftMessage/etc/webapi.xml index c5dd571a7ac..bb0b2f07956 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/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php index 2779a7f88a1..f976bfa741d 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php @@ -60,6 +60,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 +138,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 00000000000..d7c4ac6e9c4 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php @@ -0,0 +1,119 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\GiftMessage\Api; + +use Magento\TestFramework\TestCase\WebapiAbstract; + +class GuestCartRepositoryTest extends WebapiAbstract +{ + const SERVICE_VERSION = 'V1'; + const SERVICE_NAME = 'giftMessageCartRepositoryV1'; + 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 + */ + 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 00000000000..c44e7621f24 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php @@ -0,0 +1,129 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +// @codingStandardsIgnoreFile + +namespace Magento\GiftMessage\Api; + +use Magento\TestFramework\TestCase\WebapiAbstract; + +class GuestItemRepositoryTest extends WebapiAbstract +{ + const SERVICE_VERSION = 'V1'; + const SERVICE_NAME = 'giftMessageItemRepositoryV1'; + 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 + */ + 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 3673cb930e8..5fb95081c25 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php @@ -65,6 +65,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 +145,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/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 00000000000..56674a5ba81 --- /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 00000000000..42ae5826a8e --- /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 cb590f2ddd2..cb56c205bad 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 848b8d25624..7a575f296fd 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(); -- GitLab From 1a849249805ab8b2a793732351b79e6f16d361c9 Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Wed, 10 Jun 2015 19:52:27 +0300 Subject: [PATCH 109/396] MTA-2350: Add wait to form element before filling a value --- .../Backend/Test/Block/Widget/FormTabs.php | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php index b11db4365fa..fac7674d268 100755 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php @@ -88,7 +88,6 @@ class FormTabs extends Form $tab = $this->getTab($tabName); $this->openTab($tabName); $tab->fillFormTab(array_merge($tabFields, $this->unassignedFields), $context); - $this->updateUnassignedFields($tab); } if (!empty($this->unassignedFields)) { $this->fillMissedFields($tabs); @@ -97,19 +96,6 @@ class FormTabs extends Form return $this; } - /** - * Update array with fields which aren't assigned to any tab - * - * @param Tab $tab - */ - protected function updateUnassignedFields(Tab $tab) - { - $this->unassignedFields = array_diff_key( - $this->unassignedFields, - array_intersect_key($this->unassignedFields, $tab->setFields) - ); - } - /** * Fill fields which weren't found on filled tabs * @@ -120,11 +106,17 @@ class FormTabs extends Form */ protected function fillMissedFields(array $tabs) { - foreach (array_diff_key($this->tabs, $tabs) as $tabName => $tabData) { + foreach ($this->tabs as $tabName => $tabData) { $tab = $this->getTab($tabName); - if ($this->openTab($tabName)) { - $tab->fillFormTab($this->unassignedFields, $this->_rootElement); - $this->updateUnassignedFields($tab); + if ($this->openTab($tabName) && $this->isTabVisible($tabName)) { + $mapping = $tab->dataMapping($this->unassignedFields); + foreach ($mapping as $fieldName => $data) { + $element = $tab->_rootElement->find($data['selector'], $data['strategy'], $data['input']); + if ($element->isVisible()) { + $element->setValue($data['value']); + unset($this->unassignedFields[$fieldName]); + } + } if (empty($this->unassignedFields)) { break; } -- GitLab From 4dc28a417c9e3c8e71151272d802b1df5bd69055 Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Wed, 10 Jun 2015 21:55:51 +0300 Subject: [PATCH 110/396] MAGETWO-38513: Refactor indexer table choosing strategy --- .../Bundle/Model/Resource/Indexer/Price.php | 17 +--- .../Product/Indexer/AbstractIndexer.php | 4 +- .../Product/Indexer/Eav/AbstractEav.php | 6 +- .../Resource/Product/Indexer/Eav/Decimal.php | 5 +- .../Resource/Product/Indexer/Eav/Source.php | 9 +- .../Product/Indexer/Price/DefaultPrice.php | 30 +++---- .../Resource/Indexer/Stock/DefaultStock.php | 11 ++- .../Product/Indexer/Price/Configurable.php | 12 +-- .../Model/Resource/Indexer/Price.php | 7 +- .../Product/Indexer/Price/Grouped.php | 2 +- .../Indexer/Model/Indexer/Table/Strategy.php | 71 +++++++++++++++ .../Model/Indexer/Table/StrategyInterface.php | 45 ++++++++++ .../Model/Resource/AbstractResource.php | 40 +++++---- .../Unit/Model/Indexer/Table/StrategyTest.php | 86 +++++++++++++++++++ .../Model/Resource/AbstractResourceTest.php | 37 +++++++- app/code/Magento/Indexer/etc/di.xml | 1 + 16 files changed, 300 insertions(+), 83 deletions(-) create mode 100644 app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php create mode 100644 app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php create mode 100644 app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php diff --git a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php index e4a7ceb9990..c421bd19255 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->useIdxTable(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/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php index 0b27b2e3519..88165446bb8 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php @@ -24,15 +24,17 @@ abstract class AbstractIndexer extends \Magento\Indexer\Model\Resource\AbstractR * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Eav\Model\Config $eavConfig + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, \Magento\Eav\Model\Config $eavConfig, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $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 450b8207a86..8703909005c 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 @@ -25,16 +25,18 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_eventManager = $eventManager; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $eavConfig, $tableStrategy, $resourcePrefix); } /** @@ -45,7 +47,7 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index */ public function reindexAll() { - $this->useIdxTable(true); + $this->_tableStrategy->useIdxTable(true); $this->beginTransaction(); try { $this->clearTemporaryIndexTable(); 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 49c694355da..7bcfab406f8 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 287847f4acf..5b5aae32dfd 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 @@ -28,6 +28,7 @@ class Source extends AbstractEav * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param string|null $resourcePrefix */ public function __construct( @@ -35,10 +36,11 @@ class Source extends AbstractEav \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Catalog\Model\Resource\Helper $resourceHelper, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_resourceHelper = $resourceHelper; - parent::__construct($context, $eavConfig, $eventManager, $resourcePrefix); + parent::__construct($context, $eavConfig, $eventManager, $tableStrategy, $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 7c488ecf2ec..9bf37432fb6 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,22 +42,26 @@ 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\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Framework\Module\Manager $moduleManager - * @param string|null $resourcePrefix + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy + * @param null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Framework\Module\Manager $moduleManager, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_eventManager = $eventManager; $this->moduleManager = $moduleManager; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $eavConfig, $tableStrategy, $resourcePrefix); } /** @@ -129,7 +133,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->useIdxTable(true); + $this->_tableStrategy->useIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -176,10 +180,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 +331,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 +341,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 +625,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/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php index 05de6b3ffe2..069d46c5930 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php @@ -38,16 +38,18 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_scopeConfig = $scopeConfig; - parent::__construct($context, $eavConfig, $resourcePrefix); + parent::__construct($context, $eavConfig, $tableStrategy, $resourcePrefix); } /** @@ -68,7 +70,7 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->useIdxTable(true); + $this->_tableStrategy->useIdxTable(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/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php b/app/code/Magento/ConfigurableProduct/Model/Resource/Product/Indexer/Price/Configurable.php index 086efbbf9f8..31354d35630 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->useIdxTable(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/Downloadable/Model/Resource/Indexer/Price.php b/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php index accf63a02ea..04ca2f6c900 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->useIdxTable(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/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php b/app/code/Magento/GroupedProduct/Model/Resource/Product/Indexer/Price/Grouped.php index 1aa5d99953b..b4f876d5e97 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->useIdxTable(true); $this->beginTransaction(); try { $this->_prepareGroupedProductPriceData(); 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 00000000000..afcdbf29b8b --- /dev/null +++ b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php @@ -0,0 +1,71 @@ +<?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 useIdxTable($value = null) + { + if ($value !== null) { + $this->_useIdxTable = (bool) $value; + } + return $this->_useIdxTable; + } + + /** + * {@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->useIdxTable() + ? $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 00000000000..ac1fc631357 --- /dev/null +++ b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php @@ -0,0 +1,45 @@ +<?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'; + + /** + * Is direct table writing required + * + * @param bool $value + * + * @return bool + */ + public function useIdxTable($value = null); + + /** + * 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 9fa80dac9e7..021fbaa43df 100644 --- a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php +++ b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php @@ -16,16 +16,29 @@ 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 +47,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function reindexAll() { - $this->useIdxTable(true); + $this->_tableStrategy->useIdxTable(true); return $this; } @@ -56,14 +69,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()); } /** @@ -163,10 +172,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function useIdxTable($value = null) { - if ($value !== null) { - $this->_isNeedUseIdxTable = (bool)$value; - } - return $this->_isNeedUseIdxTable; + return $this->_tableStrategy->useIdxTable($value); } /** 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 00000000000..b990d53ff17 --- /dev/null +++ b/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php @@ -0,0 +1,86 @@ +<?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 + */ + public function testUseIdxTable() + { + $this->assertEquals(false, $this->_model->useIdxTable()); + $this->assertEquals(false, $this->_model->useIdxTable(false)); + $this->assertEquals(true, $this->_model->useIdxTable(true)); + $this->assertEquals(true, $this->_model->useIdxTable()); + $this->assertEquals(false, $this->_model->useIdxTable(false)); + $this->assertEquals(false, $this->_model->useIdxTable()); + } + + /** + * Test table name preparation + */ + public function testPrepareTableName() + { + $this->assertEquals('test_tmp', $this->_model->prepareTableName('test')); + $this->_model->useIdxTable(true); + $this->assertEquals('test_idx', $this->_model->prepareTableName('test')); + $this->_model->useIdxTable(false); + $this->assertEquals('test_tmp', $this->_model->prepareTableName('test')); + } + + /** + * Test table name getter + */ + 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->useIdxTable(true); + $this->assertEquals('pre_test_idx', $this->_model->getTableName('test')); + } +} 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 79e058df703..d0ac5830f2e 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,14 +52,34 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase public function testReindexAll() { + $this->_tableStrategyInterface->expects($this->once()) + ->method('useIdxTable') + ->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->_tableStrategyInterface->expects($this->once()) + ->method('prepareTableName') + ->with('test') + ->will($this->returnValue('test_idx')); + $this->model->useIdxTable(true); $this->assertEquals('test_idx', $this->model->getIdxTable('test')); + } + + public function testUseTmpTable() + { + $this->_tableStrategyInterface->expects($this->once()) + ->method('prepareTableName') + ->with('test') + ->will($this->returnValue('test_tmp')); $this->model->useIdxTable(false); $this->assertEquals('test_tmp', $this->model->getIdxTable('test')); } diff --git a/app/code/Magento/Indexer/etc/di.xml b/app/code/Magento/Indexer/etc/di.xml index 8c6730dffb5..ae0bc99ad34 100644 --- a/app/code/Magento/Indexer/etc/di.xml +++ b/app/code/Magento/Indexer/etc/di.xml @@ -10,6 +10,7 @@ <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"> <arguments> <argument name="view" xsi:type="object" shared="false">Magento\Framework\Mview\View</argument> -- GitLab From a8cc0b18b7cc05a8ce09e4c2509b85eb2edeac4f Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Thu, 11 Jun 2015 10:49:10 +0300 Subject: [PATCH 111/396] MAGETWO-38526: Implement API services for Magento\GiftMessage --- .../GiftMessage/Test/Unit/Model/CartRepositoryTest.php | 3 ++- .../GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php | 4 +++- .../GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php | 3 ++- .../GiftMessage/Test/Unit/Model/ItemRepositoryTest.php | 3 ++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/CartRepositoryTest.php index 6974c1f131c..2998ba06c76 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/GuestCartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php index f35fa39c514..13c069281ed 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php @@ -4,7 +4,9 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\GiftMessage\Test\Unit\Model; +namespace Magento\GiftMessage\Test\Unit\Model\Plugin; + +// @codingStandardsIgnoreFile use Magento\GiftMessage\Api\Data\MessageInterface; use Magento\GiftMessage\Model\ItemRepository; diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php index 4bbbbf7edca..ec445ead217 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestItemRepositoryTest.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 GuestItemRepositoryTest extends \PHPUnit_Framework_TestCase diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/ItemRepositoryTest.php index 5caa71f1b2b..ed3f45fd157 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 -- GitLab From 71a451e3fe08e2ff81fa214ab4b26a0fc848a96f Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Thu, 11 Jun 2015 11:34:45 +0300 Subject: [PATCH 112/396] MAGETWO-38537: Update Mysql DB adapter --- .../Magento/Framework/DB/Adapter/Pdo/Mysql.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 74d74986e0e..b0fb0534ea2 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -2002,6 +2002,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_Pdo_Statement + */ + 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->rawQuery($sql); + } + /** * Rename several tables * -- GitLab From d0018ccf174f0f9d5235b18ca3def5d28a024166 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Thu, 11 Jun 2015 11:41:13 +0300 Subject: [PATCH 113/396] MAGETWO-38542: Optimize Catalog EAV indexer --- .../Product/Indexer/Eav/AbstractEav.php | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) 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 450b8207a86..202f4fc767c 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 @@ -46,19 +46,11 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index public function reindexAll() { $this->useIdxTable(true); - $this->beginTransaction(); - try { - $this->clearTemporaryIndexTable(); - $this->_prepareIndex(); - $this->_prepareRelationIndex(); - $this->_removeNotVisibleEntityFromIndex(); - - $this->syncData(); - $this->commit(); - } catch (\Exception $e) { - $this->rollBack(); - throw $e; - } + $this->clearTemporaryIndexTable(); + $this->_prepareIndex(); + $this->_prepareRelationIndex(); + $this->_removeNotVisibleEntityFromIndex(); + $this->syncData(); return $this; } @@ -94,20 +86,12 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index $this->_prepareRelationIndex($processIds); $this->_removeNotVisibleEntityFromIndex(); - $adapter->beginTransaction(); - try { - // remove old index - $where = $adapter->quoteInto('entity_id IN(?)', $processIds); - $adapter->delete($this->getMainTable(), $where); - - // insert new index - $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); - $adapter->commit(); - } catch (\Exception $e) { - $adapter->rollBack(); - throw $e; - } + // remove old index + $where = $adapter->quoteInto('entity_id IN(?)', $processIds); + $adapter->delete($this->getMainTable(), $where); + // insert new index + $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); return $this; } @@ -174,12 +158,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 +199,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 -- GitLab From d1c2bf368795e1539689afa73f8f7ca17e9b1c6b Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Thu, 11 Jun 2015 12:18:00 +0300 Subject: [PATCH 114/396] MAGETWO-38513: Refactor indexer table choosing strategy - CR Changes --- .../Bundle/Model/Resource/Indexer/Price.php | 2 +- .../Product/Indexer/Eav/AbstractEav.php | 2 +- .../Product/Indexer/Price/DefaultPrice.php | 2 +- .../Resource/Indexer/Stock/DefaultStock.php | 2 +- .../Product/Indexer/Price/Configurable.php | 2 +- .../Model/Resource/Indexer/Price.php | 2 +- .../Product/Indexer/Price/Grouped.php | 2 +- .../Indexer/Model/Indexer/Table/Strategy.php | 16 ++++++++---- .../Model/Indexer/Table/StrategyInterface.php | 13 +++++++--- .../Model/Resource/AbstractResource.php | 13 +--------- .../Unit/Model/Indexer/Table/StrategyTest.php | 25 ++++++++++++------- .../Model/Resource/AbstractResourceTest.php | 23 +---------------- app/code/Magento/Indexer/etc/di.xml | 3 ++- 13 files changed, 48 insertions(+), 59 deletions(-) diff --git a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php index c421bd19255..20edf5bea63 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->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { 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 8703909005c..8cd5c0a434a 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 @@ -47,7 +47,7 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index */ public function reindexAll() { - $this->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->clearTemporaryIndexTable(); 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 9bf37432fb6..2c2ffacc412 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 @@ -133,7 +133,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); 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 069d46c5930..039c292f25f 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php @@ -70,7 +70,7 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareIndexTable(); 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 31354d35630..c0df3ead762 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->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); diff --git a/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php b/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php index 04ca2f6c900..ca78f7370b0 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->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); 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 b4f876d5e97..0b938b2e0ff 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->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareGroupedProductPriceData(); diff --git a/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php index afcdbf29b8b..976e0a27d63 100644 --- a/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php +++ b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php @@ -39,14 +39,20 @@ class Strategy implements StrategyInterface /** * {@inheritdoc} */ - public function useIdxTable($value = null) + public function getUseIdxTable() { - if ($value !== null) { - $this->_useIdxTable = (bool) $value; - } return $this->_useIdxTable; } + /** + * {@inheritdoc} + */ + public function setUseIdxTable($value = false) + { + $this->_useIdxTable = (bool) $value; + return $this; + } + /** * {@inheritdoc} */ @@ -64,7 +70,7 @@ class Strategy implements StrategyInterface */ public function prepareTableName($tablePrefix) { - return $this->useIdxTable() + 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 index ac1fc631357..fd907449bb7 100644 --- a/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php +++ b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php @@ -17,13 +17,20 @@ interface StrategyInterface const TMP_SUFFIX = '_tmp'; /** - * Is direct table writing required + * Get IDX table usage flag + * + * @return bool + */ + public function getUseIdxTable(); + + /** + * Set IDX table usage flag * * @param bool $value * - * @return bool + * @return $this */ - public function useIdxTable($value = null); + public function setUseIdxTable($value = false); /** * Prepare index table name diff --git a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php index 021fbaa43df..15089eb35fe 100644 --- a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php +++ b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php @@ -47,7 +47,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function reindexAll() { - $this->_tableStrategy->useIdxTable(true); + $this->_tableStrategy->setUseIdxTable(true); return $this; } @@ -164,17 +164,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) - { - return $this->_tableStrategy->useIdxTable($value); - } - /** * 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 index b990d53ff17..d8c5aec54ec 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php @@ -44,31 +44,38 @@ class StrategyTest extends \PHPUnit_Framework_TestCase /** * Test use idx table switcher + * + * @return void */ public function testUseIdxTable() { - $this->assertEquals(false, $this->_model->useIdxTable()); - $this->assertEquals(false, $this->_model->useIdxTable(false)); - $this->assertEquals(true, $this->_model->useIdxTable(true)); - $this->assertEquals(true, $this->_model->useIdxTable()); - $this->assertEquals(false, $this->_model->useIdxTable(false)); - $this->assertEquals(false, $this->_model->useIdxTable()); + $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->useIdxTable(true); + $this->_model->setUseIdxTable(true); $this->assertEquals('test_idx', $this->_model->prepareTableName('test')); - $this->_model->useIdxTable(false); + $this->_model->setUseIdxTable(false); $this->assertEquals('test_tmp', $this->_model->prepareTableName('test')); } /** * Test table name getter + * + * @return void */ public function testGetTableName() { @@ -80,7 +87,7 @@ class StrategyTest extends \PHPUnit_Framework_TestCase ) ); $this->assertEquals('pre_test_tmp', $this->_model->getTableName('test')); - $this->_model->useIdxTable(true); + $this->_model->setUseIdxTable(true); $this->assertEquals('pre_test_idx', $this->_model->getTableName('test')); } } 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 d0ac5830f2e..07b7bf63f7c 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Resource/AbstractResourceTest.php @@ -53,7 +53,7 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase public function testReindexAll() { $this->_tableStrategyInterface->expects($this->once()) - ->method('useIdxTable') + ->method('setUseIdxTable') ->with(true); $this->_tableStrategyInterface->expects($this->once()) ->method('prepareTableName') @@ -63,27 +63,6 @@ class AbstractResourceTest extends \PHPUnit_Framework_TestCase $this->assertEquals('test_idx', $this->model->getIdxTable('test')); } - public function testUseIdxTable() - { - $this->_tableStrategyInterface->expects($this->once()) - ->method('prepareTableName') - ->with('test') - ->will($this->returnValue('test_idx')); - - $this->model->useIdxTable(true); - $this->assertEquals('test_idx', $this->model->getIdxTable('test')); - } - - public function testUseTmpTable() - { - $this->_tableStrategyInterface->expects($this->once()) - ->method('prepareTableName') - ->with('test') - ->will($this->returnValue('test_tmp')); - $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/di.xml b/app/code/Magento/Indexer/etc/di.xml index ae0bc99ad34..d6c354590a6 100644 --- a/app/code/Magento/Indexer/etc/di.xml +++ b/app/code/Magento/Indexer/etc/di.xml @@ -10,7 +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" /> + <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> -- GitLab From e8d382af9330872c1f4fa198fc8cfd66e7465f8b Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Thu, 11 Jun 2015 12:20:26 +0300 Subject: [PATCH 115/396] MAGETWO-38513: Refactor indexer table choosing strategy - CR Changes - remover underscore in protected property naming, fixed typehinting --- .../Magento/Bundle/Model/Resource/Indexer/Price.php | 8 ++++---- .../Resource/Product/Indexer/Eav/AbstractEav.php | 2 +- .../Model/Resource/Product/Indexer/Eav/Decimal.php | 2 +- .../Model/Resource/Product/Indexer/Eav/Source.php | 2 +- .../Resource/Product/Indexer/Price/DefaultPrice.php | 12 ++++++------ .../Model/Resource/Indexer/Stock/DefaultStock.php | 4 ++-- .../Resource/Product/Indexer/Price/Configurable.php | 6 +++--- .../Downloadable/Model/Resource/Indexer/Price.php | 4 ++-- .../Model/Resource/Product/Indexer/Price/Grouped.php | 2 +- .../Indexer/Model/Resource/AbstractResource.php | 10 +++++----- 10 files changed, 26 insertions(+), 26 deletions(-) diff --git a/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php b/app/code/Magento/Bundle/Model/Resource/Indexer/Price.php index 20edf5bea63..f216ecfc5b4 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->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { @@ -54,7 +54,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundlePriceTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_bundle'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle'); } /** @@ -64,7 +64,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundleSelectionTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_bundle_sel'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle_sel'); } /** @@ -74,7 +74,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getBundleOptionTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_bundle_opt'); + return $this->tableStrategy->getTableName('catalog_product_index_price_bundle_opt'); } /** 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 8cd5c0a434a..af471980c1f 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 @@ -47,7 +47,7 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index */ public function reindexAll() { - $this->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->clearTemporaryIndexTable(); 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 7bcfab406f8..f8e73ca886a 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,6 +131,6 @@ class Decimal extends AbstractEav */ public function getIdxTable($table = null) { - return $this->_tableStrategy->getTableName('catalog_product_index_eav_decimal'); + 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 5b5aae32dfd..9b557b82c97 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 @@ -323,6 +323,6 @@ class Source extends AbstractEav */ public function getIdxTable($table = null) { - return $this->_tableStrategy->getTableName('catalog_product_index_eav'); + 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 2c2ffacc412..af1ba60a190 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 @@ -49,7 +49,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Framework\Module\Manager $moduleManager * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy - * @param null $resourcePrefix + * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, @@ -133,7 +133,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -180,7 +180,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getDefaultFinalPriceTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_final'); + return $this->tableStrategy->getTableName('catalog_product_index_price_final'); } /** @@ -331,7 +331,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getCustomOptionAggregateTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_opt_agr'); + return $this->tableStrategy->getTableName('catalog_product_index_price_opt_agr'); } /** @@ -341,7 +341,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ protected function _getCustomOptionPriceTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_opt'); + return $this->tableStrategy->getTableName('catalog_product_index_price_opt'); } /** @@ -625,7 +625,7 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function getIdxTable($table = null) { - return $this->_tableStrategy->getTableName('catalog_product_index_price'); + return $this->tableStrategy->getTableName('catalog_product_index_price'); } /** 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 039c292f25f..844cc8b3831 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php @@ -70,7 +70,7 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function reindexAll() { - $this->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareIndexTable(); @@ -289,6 +289,6 @@ class DefaultStock extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr */ public function getIdxTable($table = null) { - return $this->_tableStrategy->getTableName('cataloginventory_stock_status'); + return $this->tableStrategy->getTableName('cataloginventory_stock_status'); } } 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 c0df3ead762..2dc2f6d2c88 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->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -63,7 +63,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ protected function _getConfigurableOptionAggregateTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_cfg_opt_agr'); + return $this->tableStrategy->getTableName('catalog_product_index_price_cfg_opt_agr'); } /** @@ -73,7 +73,7 @@ class Configurable extends \Magento\Catalog\Model\Resource\Product\Indexer\Price */ protected function _getConfigurableOptionPriceTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_cfg_opt'); + return $this->tableStrategy->getTableName('catalog_product_index_price_cfg_opt'); } /** diff --git a/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php b/app/code/Magento/Downloadable/Model/Resource/Indexer/Price.php index ca78f7370b0..4245dede4be 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->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->reindex(); @@ -68,7 +68,7 @@ class Price extends \Magento\Catalog\Model\Resource\Product\Indexer\Price\Defaul */ protected function _getDownloadableLinkPriceTable() { - return $this->_tableStrategy->getTableName('catalog_product_index_price_downlod'); + return $this->tableStrategy->getTableName('catalog_product_index_price_downlod'); } /** 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 0b938b2e0ff..78155ac89ac 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->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); $this->beginTransaction(); try { $this->_prepareGroupedProductPriceData(); diff --git a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php index 15089eb35fe..ad42f4bebea 100644 --- a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php +++ b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php @@ -21,7 +21,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs * * @var \Magento\Indexer\Model\Indexer\Table\StrategyInterface */ - protected $_tableStrategy; + protected $tableStrategy; /** * Class constructor @@ -36,7 +36,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { - $this->_tableStrategy = $tableStrategy; + $this->tableStrategy = $tableStrategy; parent::__construct($context, $resourcePrefix); } @@ -47,7 +47,7 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs */ public function reindexAll() { - $this->_tableStrategy->setUseIdxTable(true); + $this->tableStrategy->setUseIdxTable(true); return $this; } @@ -70,9 +70,9 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs public function getIdxTable($table = null) { if ($table) { - return $this->_tableStrategy->prepareTableName($table); + return $this->tableStrategy->prepareTableName($table); } - return $this->_tableStrategy->prepareTableName($this->getMainTable()); + return $this->tableStrategy->prepareTableName($this->getMainTable()); } /** -- GitLab From 9e06e859ade066f29e9285db57ef47ed81d28b21 Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Thu, 11 Jun 2015 12:25:01 +0300 Subject: [PATCH 116/396] MAGETWO-38513: Refactor indexer table choosing strategy - CR Changes - removed underscore in protected property naming --- app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php index 976e0a27d63..2d6c154a2a7 100644 --- a/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php +++ b/app/code/Magento/Indexer/Model/Indexer/Table/Strategy.php @@ -34,14 +34,14 @@ class Strategy implements StrategyInterface * * @var bool */ - protected $_useIdxTable = false; + protected $useIdxTable = false; /** * {@inheritdoc} */ public function getUseIdxTable() { - return $this->_useIdxTable; + return $this->useIdxTable; } /** @@ -49,7 +49,7 @@ class Strategy implements StrategyInterface */ public function setUseIdxTable($value = false) { - $this->_useIdxTable = (bool) $value; + $this->useIdxTable = (bool) $value; return $this; } -- GitLab From 2f89ae46c3a0869412b60412883d2d70d8f67360 Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Thu, 11 Jun 2015 12:53:08 +0300 Subject: [PATCH 117/396] MAGETWO-38526: Implement API services for Magento\GiftMessage --- .../testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php | 3 ++- .../Magento/GiftMessage/Api/GuestCartRepositoryTest.php | 3 ++- .../Magento/GiftMessage/Api/GuestItemRepositoryTest.php | 3 +-- .../testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php | 3 +-- 4 files changed, 6 insertions(+), 6 deletions(-) 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 f976bfa741d..443e464649c 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 diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php index d7c4ac6e9c4..5a907868bf4 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.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 GuestCartRepositoryTest extends WebapiAbstract diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php index c44e7621f24..a7f15332ca5 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.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 GuestItemRepositoryTest extends WebapiAbstract 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 5fb95081c25..9de8af66b24 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 -- GitLab From 97a93ef5ca2c129d6eadf7f20c1dc8f6c78cf8bb Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Thu, 11 Jun 2015 12:54:53 +0300 Subject: [PATCH 118/396] MAGETWO-38526: Implement API services for Magento\GiftMessage --- .../GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php index 13c069281ed..f5fc6950265 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php @@ -4,7 +4,7 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\GiftMessage\Test\Unit\Model\Plugin; +namespace Magento\GiftMessage\Test\Unit\Model; // @codingStandardsIgnoreFile -- GitLab From 440602f5fb79f4c1cc59820807bc232a5569970d Mon Sep 17 00:00:00 2001 From: Bogdan Plieshka <bplieshka@ebay.com> Date: Thu, 11 Jun 2015 13:03:08 +0300 Subject: [PATCH 119/396] MAGETWO-38407: Admin panel pop-ups contain lots of empty space - Moved structure container to inline-block model to resolve dialogs widget positioning issues - Fixed menu top indent --- .../backend/Magento_Backend/web/css/source/module/_menu.less | 4 ++-- .../Magento_Backend/web/css/source/module/pages/_login.less | 1 + .../adminhtml/Magento/backend/web/css/source/_structure.less | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) 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 7301a194265..f9f3626a797 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 2e93e6c124f..8291e266f89 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/web/css/source/_structure.less b/app/design/adminhtml/Magento/backend/web/css/source/_structure.less index c4431841153..72b6c8c4b0d 100644 --- a/app/design/adminhtml/Magento/backend/web/css/source/_structure.less +++ b/app/design/adminhtml/Magento/backend/web/css/source/_structure.less @@ -37,8 +37,10 @@ body { } .page-wrapper { + display: inline-block; background-color: @page-wrapper__background-color; - float: left; + margin-left: -4px; // Clear inline-block gap + vertical-align: top; width: ~'calc(100% - @{menu__width})'; } -- GitLab From 302c2dbb5d0d775597d3be239e13413516951796 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Thu, 11 Jun 2015 13:05:14 +0300 Subject: [PATCH 120/396] MAGETWO-38537: Update Mysql DB adapter --- .../Magento/Framework/DB/Adapter/AdapterInterface.php | 10 ++++++++++ .../Magento/Framework/DB/Adapter/Pdo/Mysql.php | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php index 96eb992ade3..77f3975b97c 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 = null); + /** * Drop temporary table from database * diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index b0fb0534ea2..3c5e7618339 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -2008,7 +2008,7 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface * @param string $temporaryTableName * @param string $originTableName * @param bool $ifNotExists - * @return \Zend_Db_Pdo_Statement + * @return \Zend_Db_Statement_Pdo */ public function createTemporaryTableLike($temporaryTableName, $originTableName, $ifNotExists = false) { @@ -2017,7 +2017,7 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface $originTable = $this->quoteIdentifier($this->_getTableName($originTableName)); $sql = sprintf('CREATE TEMPORARY TABLE %s %s LIKE %s', $ifNotExistsSql, $temporaryTable, $originTable); - return $this->rawQuery($sql); + return $this->query($sql); } /** -- GitLab From d862ff255403e66d71dd2bc536d829900ff27258 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Thu, 11 Jun 2015 13:08:45 +0300 Subject: [PATCH 121/396] MAGETWO-38537: Update Mysql DB adapter --- lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php index 77f3975b97c..8bee03a383e 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php +++ b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php @@ -137,7 +137,7 @@ interface AdapterInterface * @param bool $ifNotExists * @return \Zend_Db_Statement_Interface */ - public function createTemporaryTableLike($temporaryTableName, $originTableName, $ifNotExists = null); + public function createTemporaryTableLike($temporaryTableName, $originTableName, $ifNotExists = false); /** * Drop temporary table from database -- GitLab From cd0cd6cb2f7734960284b396c7d203c5f42cf51f Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 11 Jun 2015 13:57:39 +0300 Subject: [PATCH 122/396] MAGETWO-38156: Move gift message to cart --- app/code/Magento/GiftMessage/etc/frontend/di.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/GiftMessage/etc/frontend/di.xml b/app/code/Magento/GiftMessage/etc/frontend/di.xml index e46293f688b..faa2f043fe6 100644 --- a/app/code/Magento/GiftMessage/etc/frontend/di.xml +++ b/app/code/Magento/GiftMessage/etc/frontend/di.xml @@ -29,7 +29,7 @@ <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> -- GitLab From 4f8bbabbbfa6ec808fff5c679071ff088edb796a Mon Sep 17 00:00:00 2001 From: Bogdan Plieshka <bplieshka@ebay.com> Date: Thu, 11 Jun 2015 14:19:01 +0300 Subject: [PATCH 123/396] MAGETWO-38407: Admin panel pop-ups contain lots of empty space - CR changes --- .../adminhtml/Magento/backend/web/css/source/_structure.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 72b6c8c4b0d..4223668db06 100644 --- a/app/design/adminhtml/Magento/backend/web/css/source/_structure.less +++ b/app/design/adminhtml/Magento/backend/web/css/source/_structure.less @@ -37,8 +37,8 @@ body { } .page-wrapper { - display: inline-block; background-color: @page-wrapper__background-color; + display: inline-block; margin-left: -4px; // Clear inline-block gap vertical-align: top; width: ~'calc(100% - @{menu__width})'; -- GitLab From 8297928c9ff5531181c0ad74ad8c81bfebf1eff3 Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Thu, 11 Jun 2015 15:37:50 +0300 Subject: [PATCH 124/396] MAGETWO-38526: Implement API services for Magento\GiftMessage --- .../GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php index f5fc6950265..8344cdd7541 100644 --- a/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php +++ b/app/code/Magento/GiftMessage/Test/Unit/Model/GuestCartRepositoryTest.php @@ -14,7 +14,7 @@ use Magento\GiftMessage\Model\GuestItemRepository; use Magento\Quote\Model\QuoteIdMask; use Magento\Quote\Model\QuoteIdMaskFactory; -class GuestItemRepositoryTest extends \PHPUnit_Framework_TestCase +class GuestCartRepositoryTest extends \PHPUnit_Framework_TestCase { /** * @var GuestItemRepository -- GitLab From e5ab9fda3ccc0bc2f3d8c56e43e8ada5d7fffe36 Mon Sep 17 00:00:00 2001 From: Victor Rad <vrad@ebay.com> Date: Thu, 11 Jun 2015 15:42:52 +0300 Subject: [PATCH 125/396] MAGETWO-37983: Improve test code coverage - static test fix --- .../Test/Unit/Block/Stockqty/DefaultStockqtyTest.php | 2 +- .../Test/Unit/Model/Stock/StockItemRepositoryTest.php | 7 +++++-- .../Test/Unit/Model/Stock/StockStatusRepositoryTest.php | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) 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 99a074ec52e..fd247ef8715 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Block/Stockqty/DefaultStockqtyTest.php @@ -211,6 +211,6 @@ class DefaultStockqtyTest extends \PHPUnit_Framework_TestCase public function testGetThresholdQty() { $this->scopeConfigMock->expects($this->once())->method('getValue')->willReturn(5); - $this->assertEquals(5,$this->block->getThresholdQty()); + $this->assertEquals(5, $this->block->getThresholdQty()); } } 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 2271a633723..cfa3ca98c17 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 { @@ -42,12 +45,12 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase protected $stockItemResourceMock; /** - * @var \Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + * @var InventoryApiData\StockItemInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $stockItemFactoryMock; /** - * @var \Magento\CatalogInventory\Api\Data\StockItemCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + * @var InventoryApiData\StockItemCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $stockItemCollectionMock; diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php index 13fb764edcd..be45e36ff87 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php @@ -6,6 +6,7 @@ namespace Magento\CatalogInventory\Test\Unit\Model\Stock; use \Magento\CatalogInventory\Model\Stock\StockStatusRepository; +use \Magento\CatalogInventory\Api\Data as InventoryApiData; /** * Class StockStatusRepositoryTest @@ -33,7 +34,7 @@ class StockStatusRepositoryTest extends \PHPUnit_Framework_TestCase protected $stockStatusFactoryMock; /** - * @var Magento\CatalogInventory\Api\Data\StockStatusCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + * @var InventoryApiData\StockStatusCollectionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $stockStatusCollectionMock; -- GitLab From cf777db88ee7b67208eb36c56e451713f6dec3ca Mon Sep 17 00:00:00 2001 From: Sviatoslav Mankivskyi <smankivskyi@ebay.com> Date: Thu, 11 Jun 2015 15:53:11 +0300 Subject: [PATCH 126/396] MAGETWO-38526: Implement API services for Magento\GiftMessage --- .../testsuite/Magento/Test/Legacy/_files/obsolete_classes.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 638d18c0495..4cfed53e553 100755 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_classes.php @@ -3656,5 +3656,6 @@ return [ ['Magento\Centinel\Test\TestCase\CentinelPaymentsInvalidCcTest'], ['Magento\Centinel\Test\TestCase\CentinelPaymentsValidCcTest'], ['Magento\Centinel\CreateOrderTest'], - ['Magento\Payment\Model\Checks\PaymentMethodChecksInterface', 'Magento\Payment\Model\MethodInterface'] + ['Magento\Payment\Model\Checks\PaymentMethodChecksInterface', 'Magento\Payment\Model\MethodInterface'], + ['Magento\GiftMessage\Model\Plugin\TotalsDataProcessorPlugin'], ]; -- GitLab From 6e37831255d2cba1815cf3720aa8a8b7cde0e185 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Thu, 11 Jun 2015 16:05:43 +0300 Subject: [PATCH 127/396] MAGETWO-38542: Optimize Catalog EAV indexer --- .../Product/Indexer/Eav/AbstractEav.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) 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 202f4fc767c..be84882f46b 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 @@ -46,12 +46,18 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index public function reindexAll() { $this->useIdxTable(true); - $this->clearTemporaryIndexTable(); - $this->_prepareIndex(); - $this->_prepareRelationIndex(); - $this->_removeNotVisibleEntityFromIndex(); - $this->syncData(); - + $this->beginTransaction(); + try { + $this->clearTemporaryIndexTable(); + $this->_prepareIndex(); + $this->_prepareRelationIndex(); + $this->_removeNotVisibleEntityFromIndex(); + $this->syncData(); + $this->commit(); + } catch (\Exception $e) { + $this->rollBack(); + throw $e; + } return $this; } -- GitLab From 02f2988d8e75bcfcbe72d9933fee7dc64a0289af Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Thu, 11 Jun 2015 17:46:29 +0300 Subject: [PATCH 128/396] MAGETWO-38557: Move table strategy logic from indexer action to resources --- .../Indexer/Product/Price/AbstractAction.php | 189 ++++++------------ .../Indexer/Product/Price/Action/Full.php | 3 +- .../Product/Indexer/Price/DefaultPrice.php | 20 ++ app/code/Magento/Catalog/etc/di.xml | 2 +- 4 files changed, 87 insertions(+), 127 deletions(-) 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 6e43b066679..c6da03c6a48 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 61700737da9..8131d8db8e7 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,7 @@ class Full extends \Magento\Catalog\Model\Indexer\Product\Price\AbstractAction public function execute($ids = null) { try { - $this->_useIdxTable(true); - $this->_emptyTable($this->_getIdxTable()); + $this->_emptyTable($this->_defaultIndexerResource->getIdxTable()); $this->_prepareWebsiteDateTable(); $this->_prepareTierPriceIndex(); $this->_prepareGroupPriceIndex(); 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 af1ba60a190..8bcdb82f8bd 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 @@ -64,6 +64,26 @@ class DefaultPrice extends \Magento\Catalog\Model\Resource\Product\Indexer\Abstr parent::__construct($context, $eavConfig, $tableStrategy, $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(); + } + /** * Define main price index table * diff --git a/app/code/Magento/Catalog/etc/di.xml b/app/code/Magento/Catalog/etc/di.xml index f4aad2caa25..40b644c226a 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"> -- GitLab From bca04cc4bd267339ab394208c465084ea7e8e7db Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Thu, 11 Jun 2015 17:57:50 +0300 Subject: [PATCH 129/396] MAGETWO-38557: Move table strategy logic from indexer action to resources CR Changes --- .../Magento/Catalog/Model/Indexer/Product/Price/Action/Full.php | 1 + 1 file changed, 1 insertion(+) 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 8131d8db8e7..ac9c4391efa 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,6 +21,7 @@ class Full extends \Magento\Catalog\Model\Indexer\Product\Price\AbstractAction public function execute($ids = null) { try { + $this->_defaultIndexerResource->getTableStrategy()->setUseIdxTable(true); $this->_emptyTable($this->_defaultIndexerResource->getIdxTable()); $this->_prepareWebsiteDateTable(); $this->_prepareTierPriceIndex(); -- GitLab From 87003f04b139fbb2f8ef39ea33688ce3aaaecf1c Mon Sep 17 00:00:00 2001 From: Leonid Poluyanov <lpoluyanov@ebay.com> Date: Thu, 11 Jun 2015 18:19:38 +0300 Subject: [PATCH 130/396] MAGETWO-37246: Price Permissions not apply for configurable variations --- .../product/edit/super/attribute-js-template.phtml | 4 ++-- .../catalog/product/edit/super/attribute-template.phtml | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) 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 2865b30b771..b96279b1731 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()) {echo 'disabled="disabled"';}?> 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()) {echo 'disabled="disabled"';}?>> <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 9a50b287313..3e20649e408 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,17 +118,22 @@ $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()) {echo 'disabled="disabled"';}?> class="pricing-value validate-number" name="<?php echo $namePrefix ?>[<?php echo $valueIndex ?>][pricing_value]" value="<?php echo $block->escapeHtml($pricingValue); ?>"> + <?php if(!$block->getCanEditPrice()) { + $escapedPricingValue = $block->escapeHtml($pricingValue); + $valueName = $namePrefix . "[$valueIndex][pricing_value]"; + echo "<input type='hidden' class='pricing-value validate-number' name='$valueName' value='$escapedPricingValue'>"; + }?> </div> </div> <div class="field field-pricing-measure"> <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()) {echo 'disabled="disabled"';}?> 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":{}}'> -- GitLab From 0713375d4e9f53bf3b04de462c1a2d9d8bce6f5c Mon Sep 17 00:00:00 2001 From: Alexandr Skrashuk <Alexandr_Skrashuk@epam.com> Date: Thu, 11 Jun 2015 18:30:55 +0300 Subject: [PATCH 131/396] MAGNSWTCH-139: module added to composer json --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index d238b3a9cc5..2159bcf6a5c 100644 --- a/composer.json +++ b/composer.json @@ -131,6 +131,7 @@ "magento/module-shipping": "self.version", "magento/module-sitemap": "self.version", "magento/module-store": "self.version", + "magento/module-swatches": "self.version", "magento/module-tax": "self.version", "magento/module-tax-import-export": "self.version", "magento/module-theme": "self.version", -- GitLab From d5a912d3951e6bed6656153898ec53002bc660e1 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Thu, 11 Jun 2015 18:44:05 +0300 Subject: [PATCH 132/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../CatalogImportExport/Model/Import/Product/Option.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php index 140db08736a..46ca30e91aa 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product/Option.php @@ -402,11 +402,11 @@ class Option extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_NEW_NAMES, - __('This name is already being used. Please enter a different name.') + __('This name is already being used for custom option. Please enter a different name.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_OLD_NAMES, - __('This name is already being used. Please enter a different name.') + __('This name is already being used for custom option. Please enter a different name.') ); $this->_productEntity->addMessageTemplate( self::ERROR_AMBIGUOUS_TYPES, -- GitLab From 9089799e2ff0dac2b8c1bf8a3af566ddc2e5854a Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Thu, 11 Jun 2015 21:53:48 +0300 Subject: [PATCH 133/396] MAGETWO-37555: Popup header is our of window range while creating group product --- .../GroupedProduct/view/adminhtml/web/js/grouped-product.js | 5 ++--- .../Block/Adminhtml/Product/Grouped/AssociatedProducts.php | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js b/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js index 6bd12a1b9ed..b7badba6e79 100644 --- a/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js +++ b/app/code/Magento/GroupedProduct/view/adminhtml/web/js/grouped-product.js @@ -9,8 +9,7 @@ define([ 'jquery/ui', 'Magento_Ui/js/modal/modal', 'mage/translate', - 'mage/adminhtml/grid', - '' + 'mage/adminhtml/grid' ], function ($, mageTemplate) { 'use strict'; @@ -116,7 +115,7 @@ define([ buttons: [{ id: 'grouped-product-dialog-apply-button', text: $.mage.__('Add Selected Products'), - class: 'action-primary action-add', + 'class': 'action-primary action-add', click: function () { $.each(selectedProductList, function (index, product) { widget._add(null, product); diff --git a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php index 8dde9ad28f8..618e06a6391 100644 --- a/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php +++ b/dev/tests/functional/tests/app/Magento/GroupedProduct/Test/Block/Adminhtml/Product/Grouped/AssociatedProducts.php @@ -29,7 +29,7 @@ class AssociatedProducts extends Tab * * @var string */ - protected $productSearchGrid = "./ancestor::body//div[div[div[contains(@data-role,'add-product-dialog')]]]"; + protected $productSearchGrid = './/*[@data-role="modal"][.//*[@data-role="add-product-dialog"]]'; /** * Associated products list block @@ -54,7 +54,7 @@ class AssociatedProducts extends Tab { return $this->blockFactory->create( 'Magento\GroupedProduct\Test\Block\Adminhtml\Product\Grouped\AssociatedProducts\Search\Grid', - ['element' => $this->_rootElement->find($this->productSearchGrid, Locator::SELECTOR_XPATH)] + ['element' => $this->browser->find($this->productSearchGrid, Locator::SELECTOR_XPATH)] ); } -- GitLab From 14971a38474ec77017c76a557c6ff78584eeeae1 Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Fri, 12 Jun 2015 12:12:25 +0300 Subject: [PATCH 134/396] MAGETWO-38513: Refactor indexer table choosing strategy - Fixed Category Flat resource --- app/code/Magento/Catalog/Model/Resource/Category/Flat.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php index 01f2fa19a59..ff565a34756 100644 --- a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php +++ b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php @@ -84,6 +84,7 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Catalog\Model\Config $catalogConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager + * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param string|null $resourcePrefix */ public function __construct( @@ -93,6 +94,7 @@ class Flat extends \Magento\Indexer\Model\Resource\AbstractResource \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Catalog\Model\Config $catalogConfig, \Magento\Framework\Event\ManagerInterface $eventManager, + \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_categoryFactory = $categoryFactory; @@ -100,7 +102,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); } /** -- GitLab From dfe5d9b7a2530252ad47eca196b81700210b1d6b Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Fri, 12 Jun 2015 13:33:30 +0300 Subject: [PATCH 135/396] MAGETWO-38169: Cover with unit tests --- .../CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php index 9d995731614..627be0a34ef 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php @@ -146,7 +146,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase $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', [], [], '', 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)); -- GitLab From 6f925b9efd97d646ba55551fc99d19922bf10a29 Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Fri, 12 Jun 2015 14:07:33 +0300 Subject: [PATCH 136/396] MAGETWO-38302: Region field is absent in customer address form on backend for "United Kingdom" country. --- .../view/base/ui_component/customer_form.xml | 15 +-------------- .../Ui/view/base/web/js/form/element/abstract.js | 5 ++--- .../Ui/view/base/web/js/form/element/boolean.js | 2 +- .../Ui/view/base/web/js/form/element/date.js | 2 +- .../view/base/web/js/form/element/multiselect.js | 2 +- .../Ui/view/base/web/js/form/element/select.js | 9 +++++---- 6 files changed, 11 insertions(+), 24 deletions(-) diff --git a/app/code/Magento/Customer/view/base/ui_component/customer_form.xml b/app/code/Magento/Customer/view/base/ui_component/customer_form.xml index 0f86b821eee..cb607084ae8 100644 --- a/app/code/Magento/Customer/view/base/ui_component/customer_form.xml +++ b/app/code/Magento/Customer/view/base/ui_component/customer_form.xml @@ -413,18 +413,6 @@ </item> </argument> </field> - <field name="country_id"> - <argument name="data" xsi:type="array"> - <item name="config" xsi:type="array"> - <item name="dataType" xsi:type="string">text</item> - <item name="formElement" xsi:type="string">select</item> - <item name="source" xsi:type="string">address</item> - <item name="validation" xsi:type="array"> - <item name="required-entry" xsi:type="boolean">true</item> - </item> - </item> - </argument> - </field> <field name="region"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> @@ -437,12 +425,11 @@ </field> <field name="region_id"> <argument name="data" xsi:type="array"> - <item name="customEntry" xsi:type="string">region</item> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">text</item> <item name="formElement" xsi:type="string">select</item> <item name="source" xsi:type="string">address</item> - <item name="customEntry" xsi:type="string">region</item> + <item name="customEntry" xsi:type="boolean">true</item> <item name="validation" xsi:type="array"> <item name="required-entry" xsi:type="boolean">true</item> </item> diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/abstract.js b/app/code/Magento/Ui/view/base/web/js/form/element/abstract.js index 84ea34f8893..14ba3ef4969 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/abstract.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/abstract.js @@ -47,8 +47,7 @@ define([ _.bindAll(this, 'reset'); this._super(); - - this.initialValue = this.getInititalValue(); + this.initialValue = this.getInitialValue(); this.value(this.initialValue); @@ -97,7 +96,7 @@ define([ * * @returns {*} Elements' value. */ - getInititalValue: function () { + getInitialValue: function () { var values = [this.value(), this.default], value; diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/boolean.js b/app/code/Magento/Ui/view/base/web/js/form/element/boolean.js index 4782c853d21..efe82b0a13a 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/boolean.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/boolean.js @@ -13,7 +13,7 @@ define([ * * @return {Boolean} */ - getInititalValue: function () { + getInitialValue: function () { return !!+this._super(); }, diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/date.js b/app/code/Magento/Ui/view/base/web/js/form/element/date.js index 140f063a315..08f28b0c637 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/date.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/date.js @@ -26,7 +26,7 @@ define([ * * @returns {String} */ - getInititalValue: function () { + getInitialValue: function () { var value = this._super(); if (value) { diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js b/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js index a6dc9e3b3af..6e7b2ac69a4 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/multiselect.js @@ -20,7 +20,7 @@ define([ * * @returns {Number|String} */ - getInititalValue: function () { + getInitialValue: function () { var value = this._super(); return _.isString(value) ? value.split(',') : value; diff --git a/app/code/Magento/Ui/view/base/web/js/form/element/select.js b/app/code/Magento/Ui/view/base/web/js/form/element/select.js index 3034df1e2c6..225a6a3250d 100644 --- a/app/code/Magento/Ui/view/base/web/js/form/element/select.js +++ b/app/code/Magento/Ui/view/base/web/js/form/element/select.js @@ -14,9 +14,9 @@ define([ var inputNode = { parent: '${ $.$data.parentName }', type: 'form.input', - name: '<%= $data.index %>_input', - dataScope: '<%= $data.customEntry %>', - customScope: '<%= $data.customScope %>', + name: '${ $.$data.index }_input', + dataScope: '${ $.$data.customEntry }', + customScope: '${ $.$data.customScope }', sortOrder: { after: '${ $.$data.name }' }, @@ -157,6 +157,7 @@ define([ initFilter: function () { var filter = this.filterBy; + this.filter(this.default, filter.field); this.setLinks({ filter: filter.target }, 'imports'); @@ -181,7 +182,7 @@ define([ * * @returns {Number|String} */ - getInititalValue: function () { + getInitialValue: function () { var value = this._super(); if (value !== '') { -- GitLab From bd3bec172e71864fc6e5e1b093b0c124c5909e75 Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Fri, 12 Jun 2015 15:39:51 +0300 Subject: [PATCH 137/396] MAGETWO-38302: Region field is absent in customer address form on backend for "United Kingdom" country. --- .../Magento/Customer/view/base/ui_component/customer_form.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Customer/view/base/ui_component/customer_form.xml b/app/code/Magento/Customer/view/base/ui_component/customer_form.xml index cb607084ae8..21762022d84 100644 --- a/app/code/Magento/Customer/view/base/ui_component/customer_form.xml +++ b/app/code/Magento/Customer/view/base/ui_component/customer_form.xml @@ -429,7 +429,7 @@ <item name="dataType" xsi:type="string">text</item> <item name="formElement" xsi:type="string">select</item> <item name="source" xsi:type="string">address</item> - <item name="customEntry" xsi:type="boolean">true</item> + <item name="customEntry" xsi:type="string">region</item> <item name="validation" xsi:type="array"> <item name="required-entry" xsi:type="boolean">true</item> </item> -- GitLab From 80c386c2df3ac362ccd5981013affd56c060bdce Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Fri, 12 Jun 2015 15:50:04 +0300 Subject: [PATCH 138/396] MAGETWO-38159: Hide Country dropdown for one country merchant --- .../Magento/Checkout/Block/Cart/Shipping.php | 11 ++ .../Test/Unit/Block/Cart/ShippingTest.php | 130 +++++++++++++++--- .../frontend/templates/cart/shipping.phtml | 3 +- .../view/frontend/web/js/region-updater.js | 29 ++-- 4 files changed, 142 insertions(+), 31 deletions(-) diff --git a/app/code/Magento/Checkout/Block/Cart/Shipping.php b/app/code/Magento/Checkout/Block/Cart/Shipping.php index 8cf93dd33ea..a775846d806 100644 --- a/app/code/Magento/Checkout/Block/Cart/Shipping.php +++ b/app/code/Magento/Checkout/Block/Cart/Shipping.php @@ -309,4 +309,15 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart $block->setShippingRate($shippingRate); return $block->toHtml(); } + + /** + * Check if multiple countries for shipping is allowed + * + * @return bool + */ + public function isMultipleCountriesAllowed() + { + $collection = $this->_directoryBlock->getCountryCollection(); + return $collection->count() > 1 ? true : false; + } } diff --git a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php index fcb3e58c804..99504af6b98 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,90 @@ */ namespace Magento\Checkout\Test\Unit\Block\Cart; +use Magento\Checkout\Block\Cart\Shipping; +use Magento\Checkout\Model\Session as CheckoutSession; +use Magento\Customer\Model\Session as CustomerSession; +use Magento\Directory\Block\Data as DirectoryData; +use Magento\Framework\Pricing\PriceCurrencyInterface; +use Magento\Framework\View\Element\Template\Context; +use Magento\Framework\View\Layout; +use Magento\Shipping\Model\CarrierFactoryInterface; + 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 $directory; - protected $shippingBlock; + /** @var CarrierFactoryInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $carrierFactory; + + /** @var PriceCurrencyInterface |\PHPUnit_Framework_MockObject_MockObject */ + protected $priceCurrency; + + /** @var Layout |\PHPUnit_Framework_MockObject_MockObject */ + protected $layout; 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->directory = $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->model = new Shipping( + $this->context, + $this->customerSession, + $this->checkoutSession, + $this->directory, + $this->carrierFactory, + $this->priceCurrency + ); + } + + protected function prepareContext() + { + $this->layout = $this->getMockBuilder('Magento\Framework\View\Layout') + ->disableOriginalConstructor() + ->getMock(); + + $this->context = $this->getMockBuilder('Magento\Framework\View\Element\Template\Context') + ->disableOriginalConstructor() + ->setMethods([ + 'getLayout', + ]) + ->getMock(); + + $this->context->expects($this->once()) + ->method('getLayout') + ->will($this->returnValue($this->layout)); + } public function testGetShippingPriceHtml() @@ -38,30 +112,46 @@ 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)); + } + + /** + * @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->directory->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/view/frontend/templates/cart/shipping.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml index 7585ca9388f..37cf9ca43f9 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml @@ -71,7 +71,8 @@ "form": "#shipping-zip-form", "regionJson": <?php echo $this->helper('Magento\Directory\Helper\Data')->getRegionJson() ?>, "defaultRegion": "<?php echo $block->getEstimateRegionId() ?>", - "countriesWithOptionalZip": <?php echo $this->helper('Magento\Directory\Helper\Data')->getCountriesWithOptionalZip(true) ?> + "countriesWithOptionalZip": <?php echo $this->helper('Magento\Directory\Helper\Data')->getCountriesWithOptionalZip(true) ?>, + "isMultipleCountriesAllowed": <?php echo $block->isMultipleCountriesAllowed(); ?> } } } 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 d48975806a7..d6cef062b1d 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 -- GitLab From 47ee820b707eb9c27b82a9c5398356b0baa17f17 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 12 Jun 2015 16:26:50 +0300 Subject: [PATCH 139/396] MAGETWO-38156: Move gift message to cart --- .../Model/GiftMessageConfigProvider.php | 41 ++++- .../frontend/layout/checkout_cart_index.xml | 17 +- .../layout/checkout_cart_item_renderers.xml | 25 +++ .../frontend/web/js/action/gift-options.js | 57 +++++++ .../frontend/web/js/model/gift-message.js | 145 ++++++++++++------ .../frontend/web/js/model/gift-message_old.js | 59 +++++++ .../frontend/web/js/model/gift-options.js | 61 ++------ .../frontend/web/js/model/gift-options_old.js | 62 ++++++++ .../view/frontend/web/js/model/url-builder.js | 38 +++++ .../view/frontend/web/js/view/gift-message.js | 68 ++++++++ .../web/template/gift-message-form.html | 67 ++++++++ .../web/template/gift-message-item-level.html | 52 +++++++ .../frontend/web/template/gift-message.html | 50 ++++++ .../Ui/Component/Control/ActionPool.php | 2 +- 14 files changed, 639 insertions(+), 105 deletions(-) create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/action/gift-options.js create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message_old.js create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options_old.js create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/model/url-builder.js create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html create mode 100644 app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index aac0982ecb6..1daff7709d0 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -7,6 +7,8 @@ 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; /** * Configuration provider for GiftMessage rendering on "Shipping Method" step of checkout. @@ -38,17 +40,20 @@ class GiftMessageConfigProvider implements ConfigProviderInterface * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository * @param \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository * @param \Magento\Checkout\Model\Session $checkoutSession + * @param HttpContext $httpContext */ 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 ) { $this->scopeConfiguration = $context->getScopeConfig(); $this->cartRepository = $cartRepository; $this->itemRepository = $itemRepository; $this->checkoutSession = $checkoutSession; + $this->httpContext = $httpContext; } /** @@ -67,7 +72,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface ); if ($orderLevelGiftMessageConfiguration) { $orderMessages = $this->getOrderLevelGiftMessages(); - $configuration['isOrderLevelGiftOptionsEnabled'] = true; + $configuration['isOrderLevelGiftOptionsEnabled'] = $this->isQuoteVirtual() ? false : true; $configuration['giftMessage']['orderLevel'] = $orderMessages === null ? true : $orderMessages->getData(); } if ($itemLevelGiftMessageConfiguration) { @@ -75,9 +80,41 @@ class GiftMessageConfigProvider implements ConfigProviderInterface $configuration['isItemLevelGiftOptionsEnabled'] = true; $configuration['giftMessage']['itemLevel'] = $itemMessages === null ? true : $itemMessages; } + $configuration['storeCode'] = $this->getStoreCode(); + $configuration['isCustomerLoggedIn'] = $this->isCustomerLoggedIn(); 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()->isVirtual(); + } + /** * Load already specified quote level gift message. * 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 index 5a319b2212d..66e18b7a0f7 100644 --- a/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml +++ b/app/code/Magento/GiftMessage/view/frontend/layout/checkout_cart_index.xml @@ -8,7 +8,22 @@ <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"/> + <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 index a4c749f1f34..48fcabf626a 100644 --- 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 @@ -14,6 +14,11 @@ <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> @@ -27,6 +32,11 @@ <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> @@ -40,6 +50,11 @@ <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> @@ -53,6 +68,11 @@ <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> @@ -66,6 +86,11 @@ <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> 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 00000000000..2a0f34b37c7 --- /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', + '../model/gift-message' + ], + function(urlBuilder, storage, errorList, giftMessage) { + "use strict"; + var result = function(giftMessage) { + 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() + }) + ).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); + } + ); + }; + return result; + } +); 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 d5f0e072c77..8065bb834d1 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,102 @@ * See COPYING.txt for license details. */ /*global define*/ -define(['underscore', './gift-options'], - function(_, giftOptions) { +define(['Magento_Ui/js/lib/component/provider', 'underscore'], + function (provider, _) { "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[this.itemId]; + } else { + message = window.giftOptionsConfig.giftMessage['itemLevel'][this.itemId]; + } + 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() { + var self = this; + _.each(this.observables[this.id], function(key) { + provider[self.getUniqueKey(self.id, key)](null); + }); + _.each(this.additionalOptions, function(option) { + if (_.isFunction(option.reset)) { + option.reset(); + } + }); + this.getObservable('isClear')(true); + }, + getAfterSubmitCallbacks: function() { + var callbacks = []; + _.each(this.additionalOptions, function(option) { + if (_.isFunction(option.afterSubmit)) { + callbacks.push(option.afterSubmit); + } + }); + return callbacks; + }, + getSubmitParams: function() { + var params = {}, + self = this; + _.each(this.submitParams, function(key) { + params[key] = provider[self.getUniqueKey(self.id, key)](); + }); + + 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(self.itemId) + ); + } + }); + console.log('params', params); + 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-message_old.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message_old.js new file mode 100644 index 00000000000..d5f0e072c77 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message_old.js @@ -0,0 +1,59 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*global define*/ +define(['underscore', './gift-options'], + function(_, giftOptions) { + "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 { + 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; + } + }; + } +); 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 000bf4b508e..187f17e5b39 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/gift-options_old.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options_old.js new file mode 100644 index 00000000000..000bf4b508e --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options_old.js @@ -0,0 +1,62 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +/*global define*/ +define(['underscore'], + 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}); + } + }; + } +); 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 00000000000..9b7f807c030 --- /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 00000000000..6ae1c688f41 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-message.js @@ -0,0 +1,68 @@ +/** + * 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: false, + model: {}, + initialize: function() { + this._super() + .observe('formBlockVisibility') + .observe({'resultBlockVisibility': false}); + + this.itemId = this.itemId || 'orderLevel'; + var model = new giftMessage(this.itemId); + giftOptions.addOption(model); + this.model = model; + if (this.model.getObservable('alreadyAdded')()) { + this.resultBlockVisibility(true); + } + var self = this; + this.model.getObservable('isClear').subscribe(function(value) { + if (value == true) { + self.formBlockVisibility(false); + self.model.getObservable('alreadyAdded')(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() { + this.model.reset(); + giftOptionsService(this.model); + }, + 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/template/gift-message-form.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html new file mode 100644 index 00000000000..b0ef5560e3a --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-form.html @@ -0,0 +1,67 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<div class="gift-message"> + <!-- ko if: isActive() --> + <div class="gift-options-title"> + <span data-bind="text: $t('Gift Message (optional)')"></span> + </div> + <!-- /ko --> + <div class="gift-options-content"> + <!-- ko if: isActive() --> + <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> + <!-- /ko --> + <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 00000000000..92aed6c141c --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message-item-level.html @@ -0,0 +1,52 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<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 --> + <div class="gift-summary"> + <!-- ko if: resultBlockVisibility() --> + <!-- ko foreach: getRegion('additionalOptions') --> + <!--ko template: appliedTemplate --><!-- /ko --> + <!-- /ko --> + + <div class="gift-message-summary"> + <span data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + + <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> + <!-- /ko --> + </div> +</div> 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 00000000000..07dc26d9a5e --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -0,0 +1,50 @@ +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<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="" data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> <!-- from class content should be deleted style display none --> + <!-- 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 --> + + <div class="gift-message-summary"> + <span data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + <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> \ No newline at end of file diff --git a/app/code/Magento/Ui/Component/Control/ActionPool.php b/app/code/Magento/Ui/Component/Control/ActionPool.php index 74f327fec15..6ccb8393648 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], -- GitLab From 496bf398069998be6d152adc1068c3ed574b0e75 Mon Sep 17 00:00:00 2001 From: Vitaliy Honcharenko <vgoncharenko@ebay.com> Date: Fri, 12 Jun 2015 17:02:37 +0300 Subject: [PATCH 140/396] MTA-2340: Catalog module functional tests maintenance. Category & Product --- .../Test/TestCase/Product/CreateSimpleProductEntityTest.xml | 2 -- .../TestCase/Product/ProductTypeSwitchingOnCreationTest.php | 1 - .../TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml | 5 ----- .../Test/TestCase/Product/UpdateSimpleProductEntityTest.xml | 1 - 4 files changed, 9 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml index e84f0409dad..364854e6870 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/CreateSimpleProductEntityTest.xml @@ -257,7 +257,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> </variation> <variation name="CreateSimpleProductEntityTestVariation15"> - <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create product with tax class and group price</data> <data name="product/data/url_key" xsi:type="string">simple-product-%isolation%</data> <data name="product/data/name" xsi:type="string">Simple Product %isolation%</data> @@ -317,7 +316,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductTierPriceOnProductPage" /> </variation> <variation name="CreateSimpleProductEntityTestVariation18"> - <data name="issue" xsi:type="string">Bug: MAGETWO-35342</data> <data name="description" xsi:type="string">Create product wit suite of custom options</data> <data name="product/data/url_key" xsi:type="string">simple-product-%isolation%</data> <data name="product/data/name" xsi:type="string">Simple Product %isolation%</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php index 6c297ef596e..1cdff9dbf0e 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.php @@ -30,7 +30,6 @@ class ProductTypeSwitchingOnCreationTest extends Injectable /* tags */ const MVP = 'yes'; const DOMAIN = 'MX'; - const TO_MAINTAIN = 'yes'; /* end tags */ /** diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml index d477c119f14..21b11f5fdfa 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml @@ -8,7 +8,6 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Catalog\Test\TestCase\Product\ProductTypeSwitchingOnUpdateTest"> <variation name="ProductTypeSwitchingOnUpdateTestVariation1"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">catalogProductSimple::default</data> <data name="product" xsi:type="string">configurableProduct::default</data> <data name="actionName" xsi:type="string">-</data> @@ -28,7 +27,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation3"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">configurableProduct::default</data> <data name="product" xsi:type="string">catalogProductSimple::default</data> <data name="actionName" xsi:type="string">deleteAttributes</data> @@ -36,7 +34,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation4"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">configurableProduct::default</data> <data name="product" xsi:type="string">catalogProductVirtual::default</data> <data name="actionName" xsi:type="string">deleteAttributes</data> @@ -51,7 +48,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation6"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">catalogProductVirtual::default</data> <data name="product" xsi:type="string">configurableProduct::not_virtual_for_type_switching</data> <data name="actionName" xsi:type="string">-</data> @@ -82,7 +78,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation9"> - <data name="tag" xsi:type="string">stable:no</data> <data name="productOrigin" xsi:type="string">downloadableProduct::default</data> <data name="product" xsi:type="string">configurableProduct::not_virtual_for_type_switching</data> <data name="actionName" xsi:type="string">-</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml index 73e20318e00..05d4f3c4bc8 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml @@ -104,7 +104,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductIsNotDisplayingOnFrontend" /> </variation> <variation name="UpdateSimpleProductEntityTestVariation7"> - <data name="tag" xsi:type="string">stable:no</data> <data name="description" xsi:type="string">Update category</data> <data name="initialProduct/dataSet" xsi:type="string">product_with_category</data> <data name="product/data/category_ids/presets" xsi:type="string">default</data> -- GitLab From 33847e5cd658bcc180f69b19262923b974fbb257 Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Fri, 12 Jun 2015 17:06:56 +0300 Subject: [PATCH 141/396] MAGETWO-38159: Hide Country dropdown for one country merchant --- .../Checkout/view/frontend/templates/cart/shipping.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 37cf9ca43f9..95bce4581bc 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/shipping.phtml @@ -72,7 +72,7 @@ "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) ?>, - "isMultipleCountriesAllowed": <?php echo $block->isMultipleCountriesAllowed(); ?> + "isMultipleCountriesAllowed": <?php echo $block->isMultipleCountriesAllowed() ? 'true' : 'false'; ?> } } } -- GitLab From 8feb112b2edc1efbc40a51dcc6d4f5ad8ac88768 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Fri, 12 Jun 2015 17:41:47 +0300 Subject: [PATCH 142/396] MAGETWO-38625: Fixing bugs --- .../Product/Indexer/Eav/AbstractEav.php | 29 +++++-------------- .../Model/Resource/AbstractResource.php | 1 - .../Unit/Model/Indexer/Table/StrategyTest.php | 3 +- 3 files changed, 10 insertions(+), 23 deletions(-) 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 d5ae92c5345..6426b3881d6 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 @@ -259,15 +259,9 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index protected function _removeAttributeIndexData($attributeId) { $adapter = $this->_getWriteAdapter(); - $adapter->beginTransaction(); - try { - $where = $adapter->quoteInto('attribute_id = ?', $attributeId); - $adapter->delete($this->getMainTable(), $where); - $adapter->commit(); - } catch (\Exception $e) { - $adapter->rollback(); - throw $e; - } + + $where = $adapter->quoteInto('attribute_id = ?', $attributeId); + $adapter->delete($this->getMainTable(), $where); return $this; } @@ -282,20 +276,13 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index protected function _synchronizeAttributeIndexData($attributeId) { $adapter = $this->_getWriteAdapter(); - $adapter->beginTransaction(); - try { - // remove index by attribute - $where = $adapter->quoteInto('attribute_id = ?', $attributeId); - $adapter->delete($this->getMainTable(), $where); - // insert new index - $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); + // remove index by attribute + $where = $adapter->quoteInto('attribute_id = ?', $attributeId); + $adapter->delete($this->getMainTable(), $where); - $adapter->commit(); - } catch (\Exception $e) { - $adapter->rollback(); - throw $e; - } + // insert new index + $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); return $this; } diff --git a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php index ad42f4bebea..aeccf684e6a 100644 --- a/app/code/Magento/Indexer/Model/Resource/AbstractResource.php +++ b/app/code/Magento/Indexer/Model/Resource/AbstractResource.php @@ -26,7 +26,6 @@ abstract class AbstractResource extends \Magento\Framework\Model\Resource\Db\Abs /** * Class constructor * - * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param null $resourcePrefix 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 index d8c5aec54ec..6aed194580d 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/Indexer/Table/StrategyTest.php @@ -80,7 +80,8 @@ class StrategyTest extends \PHPUnit_Framework_TestCase public function testGetTableName() { $prefix = 'pre_'; - $this->_resourceMock->expects($this->any())->method('getTableName')->will($this->returnCallback( + $this->_resourceMock->expects($this->any())->method('getTableName')->will( + $this->returnCallback( function ($tableName) use ($prefix) { return $prefix . $tableName; } -- GitLab From 8ce0ce76a2e570dfd13909fe91e44b675089c887 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Fri, 12 Jun 2015 17:52:41 +0300 Subject: [PATCH 143/396] MAGETWO-38625: Fixing bugs --- app/code/Magento/Catalog/Model/Resource/Category/Flat.php | 1 + .../CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php | 4 ++++ .../Magento/Indexer/Model/Indexer/Table/StrategyInterface.php | 1 + 3 files changed, 6 insertions(+) diff --git a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php index ff565a34756..6cf40cc1427 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 { diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php index 627be0a34ef..8c41a3c2427 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php @@ -6,6 +6,10 @@ namespace Magento\CatalogRule\Test\Unit\Model\Indexer; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * @SuppressWarnings(PHPMD.TooManyFields) + */ class IndexBuilderTest extends \PHPUnit_Framework_TestCase { /** diff --git a/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php index fd907449bb7..c1693ceb44c 100644 --- a/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php +++ b/app/code/Magento/Indexer/Model/Indexer/Table/StrategyInterface.php @@ -20,6 +20,7 @@ interface StrategyInterface * Get IDX table usage flag * * @return bool + * @SuppressWarnings(PHPMD.BooleanGetMethodName) */ public function getUseIdxTable(); -- GitLab From f4d53c8d5191fccc7f42451a22dee51fec5497d4 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Fri, 12 Jun 2015 18:11:08 +0300 Subject: [PATCH 144/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixes after CR --- .../Checkout/view/frontend/templates/cart/form.phtml | 2 +- .../frontend/templates/cart/item/configure/updatecart.phtml | 4 ++-- .../view/frontend/templates/cart/item/default.phtml | 6 +++--- .../view/frontend/templates/onepage/review/info.phtml | 2 +- .../view/frontend/templates/onepage/review/item.phtml | 2 +- .../view/frontend/web/js/view/review/item/columns/qty.js | 2 +- .../view/frontend/web/template/minicart/item/default.html | 2 +- .../view/frontend/web/template/review/item/columns/qty.html | 2 +- setup/view/magento/setup/create-admin-account.phtml | 2 +- setup/view/magento/setup/success.phtml | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) 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 633cb23ff91..a78b7d15213 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/form.phtml @@ -26,7 +26,7 @@ <tr> <th class="col item" scope="col"><span><?php echo __('Item') ?></span></th> <th class="col price" scope="col"><span><?php echo __('Price') ?></span></th> - <th class="col qty" scope="col"><span><?php echo __('Quantity') ?></span></th> + <th class="col qty" scope="col"><span><?php echo __('Qty') ?></span></th> <th class="col subtotal" scope="col"><span><?php echo __('Subtotal') ?></span></th> </tr> </thead> diff --git a/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml b/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml index 7e0bd3d5de8..014c5666c69 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/cart/item/configure/updatecart.phtml @@ -15,9 +15,9 @@ <fieldset class="fieldset"> <?php if ($block->shouldRenderQuantity()): ?> <div class="field qty"> - <label class="label" for="qty"><span><?php echo __('Quantity') ?></span></label> + <label class="label" for="qty"><span><?php echo __('Qty') ?></span></label> <div class="control"> - <input type="number" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty() * 1 ?>" title="<?php echo __('Quantity') ?>" class="input-text qty" data-validate="{'required-number':true,digits:true}"/> + <input type="number" name="qty" id="qty" maxlength="12" value="<?php echo $block->getProductDefaultQty() * 1 ?>" title="<?php echo __('Qty') ?>" class="input-text qty" data-validate="{'required-number':true,digits:true}"/> </div> </div> <?php endif; ?> 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 1f1929ec90a..a189143ba87 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 @@ -85,10 +85,10 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima <?php $cols++; ?> </td> <?php endif; ?> - <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Quantity')); ?>"> + <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Qty')); ?>"> <div class="field qty"> <label class="label" for="cart-<?php echo $_item->getId() ?>-qty"> - <span><?php echo __('Quantity') ?></span> + <span><?php echo __('Qty') ?></span> </label> <div class="control qty"> <input id="cart-<?php echo $_item->getId() ?>-qty" @@ -96,7 +96,7 @@ $canApplyMsrp = $helper->isShowBeforeOrderConfirm($product) && $helper->isMinima value="<?php echo $block->getQty() ?>" type="number" size="4" - title="<?php echo $block->escapeHtml(__('Quantity')); ?>" + title="<?php echo $block->escapeHtml(__('Qty')); ?>" class="input-text qty" maxlength="12" data-validate="{required:true,'validate-greater-than-zero':true}" diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml index 04c6ccf52d5..410eb152883 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/info.phtml @@ -22,7 +22,7 @@ <tr> <th class="col item" scope="col"><?php echo __('Product Name') ?></th> <th class="col price" scope="col"><?php echo __('Price') ?></th> - <th class="col qty" scope="col"><?php echo __('Quantity') ?></th> + <th class="col qty" scope="col"><?php echo __('Qty') ?></th> <th class="col subtotal" scope="col"><?php echo __('Subtotal') ?></th> </tr> </thead> diff --git a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml index ed1d109353d..1c341f5cf30 100644 --- a/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml +++ b/app/code/Magento/Checkout/view/frontend/templates/onepage/review/item.phtml @@ -48,7 +48,7 @@ $_item = $block->getItem(); </span> <?php endif; ?> </td> - <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Quantity'));?>"><span class="qty"><?php echo $_item->getQty() ?></span></td> + <td class="col qty" data-th="<?php echo $block->escapeHtml(__('Qty'));?>"><span class="qty"><?php echo $_item->getQty() ?></span></td> <td class="col subtotal" data-th="<?php echo $block->escapeHtml(__('Subtotal'));?>"> <?php if ($this->helper('Magento\Tax\Helper\Data')->displayCartPriceInclTax() || $this->helper('Magento\Tax\Helper\Data')->displayCartBothPrices()): ?> <span class="price-including-tax" data-label="<?php echo $block->escapeHtml(__('Incl. Tax'));?>"> diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js b/app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js index 9933898fcd2..c3352464d34 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/review/item/columns/qty.js @@ -13,7 +13,7 @@ define( return column.extend({ defaults: { ownClass: 'qty', - columnTitle: 'Quantity', + columnTitle: 'Qty', template: 'Magento_Checkout/review/item/columns/qty' }, getValue: function(quoteItem) { 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 c8600c9cf28..7a5432c380b 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 @@ -69,7 +69,7 @@ <!-- /ko --> <div class="details-qty qty"> - <span class="label" data-bind="text: $t('Quantity')"></span> + <span class="label" data-bind="text: $t('Qty')"></span> <input data-bind="attr: { id: 'cart-item-'+item_id+'-qty', 'data-cart-item': item_id, diff --git a/app/code/Magento/Checkout/view/frontend/web/template/review/item/columns/qty.html b/app/code/Magento/Checkout/view/frontend/web/template/review/item/columns/qty.html index 87b6591f188..cc5e4d63f78 100644 --- a/app/code/Magento/Checkout/view/frontend/web/template/review/item/columns/qty.html +++ b/app/code/Magento/Checkout/view/frontend/web/template/review/item/columns/qty.html @@ -4,4 +4,4 @@ * See COPYING.txt for license details. */ --> -<td class="col qty" data-th="Quantity"><span class="qty" data-bind="text: item.qty"></span></td> \ No newline at end of file +<td class="col qty" data-th="Qty"><span class="qty" data-bind="text: item.qty"></span></td> \ No newline at end of file diff --git a/setup/view/magento/setup/create-admin-account.phtml b/setup/view/magento/setup/create-admin-account.phtml index 3af89b8a2cd..08c41774168 100644 --- a/setup/view/magento/setup/create-admin-account.phtml +++ b/setup/view/magento/setup/create-admin-account.phtml @@ -91,7 +91,7 @@ $passwordWizard = sprintf( ng-class="{'has-error': account.adminEmail.$invalid && account.submitted}" > <div class="col-m-3"> - <label class="form-label required" for="adminEmail">New EMail</label> + <label class="form-label required" for="adminEmail">New Email</label> </div> <div class="col-m-4"> <input diff --git a/setup/view/magento/setup/success.phtml b/setup/view/magento/setup/success.phtml index f894c1bec82..c75cacc1a28 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>EMail:</dt> + <dt>Email:</dt> <dd>{{admin.email}}</dd> <dt>Password:</dt> -- GitLab From ddea99ed23dd75a604a26bd8bc491e85ee2bcc21 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 12 Jun 2015 18:48:55 +0300 Subject: [PATCH 145/396] MAGETWO-38156: Move gift message to cart --- .../Model/GiftMessageConfigProvider.php | 15 ++++++++++++++- .../view/frontend/web/js/action/gift-options.js | 5 +++-- .../view/frontend/web/js/model/url-builder.js | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index 1daff7709d0..d2966bc9076 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -9,6 +9,7 @@ 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; /** * Configuration provider for GiftMessage rendering on "Shipping Method" step of checkout. @@ -35,25 +36,33 @@ class GiftMessageConfigProvider implements ConfigProviderInterface */ protected $checkoutSession; + /** + * @var \Magento\Store\Model\StoreManagerInterface + */ + protected $storeManager; + /** * @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 */ public function __construct( \Magento\Framework\App\Helper\Context $context, \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository, \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository, \Magento\Checkout\Model\Session $checkoutSession, - HttpContext $httpContext + HttpContext $httpContext, + \Magento\Store\Model\StoreManagerInterface $storeManager ) { $this->scopeConfiguration = $context->getScopeConfig(); $this->cartRepository = $cartRepository; $this->itemRepository = $itemRepository; $this->checkoutSession = $checkoutSession; $this->httpContext = $httpContext; + $this->storeManager = $storeManager; } /** @@ -82,6 +91,10 @@ class GiftMessageConfigProvider implements ConfigProviderInterface } $configuration['storeCode'] = $this->getStoreCode(); $configuration['isCustomerLoggedIn'] = $this->isCustomerLoggedIn(); + $store = $this->storeManager->getStore(); + $configuration['baseUrl'] = $store->isFrontUrlSecure() + ? $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, true) + : $store->getBaseUrl(UrlInterface::URL_TYPE_LINK, false); return $configuration; } 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 index 2a0f34b37c7..c846d399a07 100644 --- 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 @@ -8,11 +8,12 @@ define( '../model/url-builder', 'mage/storage', 'Magento_Ui/js/model/errorlist', - '../model/gift-message' + 'mage/url' ], - function(urlBuilder, storage, errorList, giftMessage) { + function(urlBuilder, storage, errorList, url) { "use strict"; var result = function(giftMessage) { + url.setBaseUrl(giftMessage.getConfigValue('baseUrl')); var quoteId = giftMessage.getConfigValue('quoteId'); var serviceUrl; if (giftMessage.getConfigValue('isCustomerLoggedIn')) { 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 index 9b7f807c030..ba62ba64f94 100644 --- 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 @@ -8,7 +8,7 @@ define( ['jquery'], function($) { return { - method: "/rest", + method: "rest", storeCode: window.giftOptionsConfig.storeCode, version: 'V1', serviceUrl: ':method/:storeCode/:version', -- GitLab From 5447f9601706c9985d5027d3b31966e14fc34309 Mon Sep 17 00:00:00 2001 From: Volodymyr Sevostianov <vsevostianov@ebay.com> Date: Fri, 12 Jun 2015 16:03:55 +0000 Subject: [PATCH 146/396] MAGETWO-38156: Move gift message to cart --- .../templates/cart/gift_options.phtml | 19 +++++++++++++++ .../item/renderer/actions/gift_options.phtml | 23 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/cart/gift_options.phtml create mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml 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 00000000000..af4d469a652 --- /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 00000000000..18086f43ed9 --- /dev/null +++ b/app/code/Magento/GiftMessage/view/frontend/templates/cart/item/renderer/actions/gift_options.phtml @@ -0,0 +1,23 @@ +<?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() ?>'"> + <!-- 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 ?> -- GitLab From 6ea78d72fd8a45eef6e9bae33f9f539beae325bf Mon Sep 17 00:00:00 2001 From: Anton Guz <aguz@ebay.com> Date: Fri, 12 Jun 2015 20:44:18 +0300 Subject: [PATCH 147/396] MAGETWO-38263: Stabilize story - Fix bookmars "Default bookmark" --- app/code/Magento/Ui/Component/Bookmark.php | 7 +- .../Ui/Controller/Adminhtml/Bookmark/Save.php | 72 +++++++++++++------ .../js/grid/controls/bookmarks/bookmarks.js | 2 +- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/app/code/Magento/Ui/Component/Bookmark.php b/app/code/Magento/Ui/Component/Bookmark.php index cbb66e06480..7c8d54889f1 100644 --- a/app/code/Magento/Ui/Component/Bookmark.php +++ b/app/code/Magento/Ui/Component/Bookmark.php @@ -75,12 +75,17 @@ class Bookmark extends AbstractComponent $bookmarks = $this->bookmarkManagement->loadByNamespace($namespace); /** @var \Magento\Ui\Api\Data\BookmarkInterface $bookmark */ foreach ($bookmarks->getItems() as $bookmark) { - $config['activeIndex'] = ($bookmark->isCurrent() ? $bookmark->getIdentifier() : 'default'); + $activeIndex = ($bookmark->isCurrent() ? $bookmark->getIdentifier() : false); + if ($bookmark->getIdentifier() == 'current') { $config['current'] = $bookmark->getConfig(); } else { $config['views'][$bookmark->getIdentifier()] = $bookmark->getConfig(); } + + if ($activeIndex !== false) { + $config['activeIndex'] = $activeIndex; + } } } diff --git a/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php b/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php index f959e11ae83..2128543535b 100644 --- a/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php +++ b/app/code/Magento/Ui/Controller/Adminhtml/Bookmark/Save.php @@ -23,6 +23,10 @@ class Save extends AbstractAction */ const CURRENT_IDENTIFIER = 'current'; + const ACTIVE_IDENTIFIER = 'activeIndex'; + + const VIEWS_IDENTIFIER = 'views'; + /** * @var BookmarkRepositoryInterface */ @@ -75,30 +79,37 @@ class Save extends AbstractAction { $bookmark = $this->bookmarkFactory->create(); $data = $this->_request->getParam('data'); - if (isset($data['views'])) { - foreach ($data['views'] as $identifier => $data) { - $updateBookmark = $this->checkBookmark($identifier); - if ($updateBookmark !== false) { - $bookmark = $updateBookmark; - } + $action = key($data); + switch($action) { + case self::ACTIVE_IDENTIFIER: + $this->updateCurrentBookmark($data[$action]); + break; + case self::CURRENT_IDENTIFIER: $this->updateBookmark( $bookmark, - $identifier, - (isset($data['label']) ? $data['label'] : ''), - $data + $action, + $bookmark->getTitle(), + $data[$action] ); - } - } else { - $identifier = isset($data['activeIndex']) - ? $data['activeIndex'] - : (isset($data[self::CURRENT_IDENTIFIER]) ? self::CURRENT_IDENTIFIER : ''); - $updateBookmark = $this->checkBookmark($identifier); - if ($updateBookmark !== false) { - $bookmark = $updateBookmark; - } - $this->updateBookmark($bookmark, $identifier, '', $data[$identifier]); + break; + + case self::VIEWS_IDENTIFIER: + foreach ($data[$action] as $identifier => $data) { + $this->updateBookmark( + $bookmark, + $identifier, + isset($data['label']) ? $data['label'] : '', + $data + ); + $this->updateCurrentBookmark($identifier); + } + + break; + + default: + throw new \LogicException(__('Unsupported bookmark action.')); } } @@ -114,20 +125,35 @@ class Save extends AbstractAction protected function updateBookmark(BookmarkInterface $bookmark, $identifier, $title, array $config = []) { $this->filterVars($config); + + $updateBookmark = $this->checkBookmark($identifier); + if ($updateBookmark !== false) { + $bookmark = $updateBookmark; + } + $bookmark->setUserId($this->userContext->getUserId()) ->setNamespace($this->_request->getParam('namespace')) ->setIdentifier($identifier) ->setTitle($title) - ->setConfig($config) - ->setCurrent($identifier !== self::CURRENT_IDENTIFIER); + ->setConfig($config); $this->bookmarkRepository->save($bookmark); + } + /** + * Update current bookmark + * + * @param string $identifier + * @return void + */ + protected function updateCurrentBookmark($identifier) + { $bookmarks = $this->bookmarkManagement->loadByNamespace($this->_request->getParam('namespace')); foreach ($bookmarks->getItems() as $bookmark) { if ($bookmark->getIdentifier() == $identifier) { - continue; + $bookmark->setCurrent(true); + } else { + $bookmark->setCurrent(false); } - $bookmark->setCurrent(false); $this->bookmarkRepository->save($bookmark); } } diff --git a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js index dd8f16498b3..286fe430740 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/controls/bookmarks/bookmarks.js @@ -45,7 +45,7 @@ define([ }, newView: { label: 'New View', - index: '${ Date.now() }', + index: '_${ Date.now() }', editing: true, isNew: true } -- GitLab From d38a7a070b35f9ba6c6c4b32be34930b884beb1c Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Sun, 14 Jun 2015 17:49:17 +0300 Subject: [PATCH 148/396] MTA-2350: Add wait to form element before filling a value --- .../Test/Page/Product/CatalogProductView.xml | 12 +- .../Product/Attribute/Set/Main/EditForm.xml | 2 +- .../Test/Constraint/AssertProductInGrid.php | 3 +- .../Test/Fixture/CatalogProductAttribute.xml | 4 +- .../CreateAttributeSetEntityTest.xml | 20 +- .../UpdateAttributeSetTest.xml | 26 +-- .../UpdateProductAttributeEntityTest.xml | 98 +++++----- .../Checkout/Test/Block/Onepage/Billing.php | 2 - .../Customer/Test/Handler/Customer/Curl.php | 28 +-- .../Customer/Test/Repository/Address.php | 4 +- .../Customer/Test/Repository/Address.xml | 172 ++++++------------ .../Customer/Test/Repository/Customer.xml | 39 +--- .../CreateExistingCustomerFrontendEntity.php | 2 +- .../TestCase/DeleteCustomerAddressTest.xml | 2 +- .../TestCase/ForgotPasswordOnFrontendTest.xml | 2 +- .../UpdateCustomerFrontendEntityTest.php | 10 - .../Test/TestCase/OnePageCheckoutTest.xml | 6 +- .../TestCase/CheckoutWithGiftMessagesTest.xml | 8 +- .../Order/Create/Billing/Address.xml | 5 +- .../Adminhtml/Order/Create/Form/Account.xml | 6 +- .../Order/Create/Items/ItemProduct.php | 21 +++ .../Test/TestCase/CreateOrderBackendTest.xml | 28 +-- .../Test/TestCase/ReorderOrderEntityTest.xml | 4 +- .../Shipping/Test/Block/Adminhtml/Form.xml | 2 +- .../TestCase/ApplyTaxBasedOnVatIdTest.xml | 4 +- .../Ups/Test/TestCase/OnePageCheckoutTest.xml | 10 +- .../Test/TestCase/OnePageCheckoutTest.xml | 10 +- .../functional/utils/generate/constraint.php | 9 - 28 files changed, 220 insertions(+), 319 deletions(-) delete mode 100644 dev/tests/functional/utils/generate/constraint.php diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml index 2fddc12693d..597a6d7f735 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Page/Product/CatalogProductView.xml @@ -6,10 +6,10 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="CatalogProductView" area="Product" mca="catalog/product/view"> - <block name="viewBlock"> - <render name="bundle" class="Magento\Bundle\Test\Block\Catalog\Product\View"/> - </block> - <block name="bundleViewBlock" class="Magento\Bundle\Test\Block\Catalog\Product\View" locator="#maincontent" strategy="css selector"/> - </page> + <page name="CatalogProductView" area="Product" mca="catalog/product/view"> + <block name="viewBlock"> + <render name="bundle" class="Magento\Bundle\Test\Block\Catalog\Product\View" /> + </block> + <block name="bundleViewBlock" class="Magento\Bundle\Test\Block\Catalog\Product\View" locator="#maincontent" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml index 887e1983789..ab116cdecc2 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Attribute/Set/Main/EditForm.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <fields> <attribute_set_name /> </fields> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php index edc00d8db75..bb1e7cc32bb 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertProductInGrid.php @@ -11,7 +11,6 @@ use Magento\Mtf\Constraint\AbstractConstraint; use Magento\Mtf\Fixture\FixtureInterface; /** - * Class AssertProductInGrid * Assert that product is present in products grid. */ class AssertProductInGrid extends AbstractConstraint @@ -63,7 +62,7 @@ class AssertProductInGrid extends AbstractConstraint } /** - * Get product type + * Get product type. * * @return string */ diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml index 1e99a0752d4..1a38dd8158c 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Fixture/CatalogProductAttribute.xml @@ -111,13 +111,13 @@ <field name="is_wysiwyg_enabled" is_required=""> <default_value xsi:type="number">0</default_value> </field> - <field name="is_used_for_promo_rules" is_required=""> + <field name="is_used_for_promo_rules" is_required="" group="frontend-properties"> <default_value xsi:type="number">0</default_value> </field> <field name="search_weight" is_required=""> <default_value xsi:type="string">1</default_value> </field> - <field name="options" is_required="" source="Magento\Catalog\Test\Fixture\CatalogProductAttribute\Options"> + <field name="options" is_required="" group="properties" source="Magento\Catalog\Test\Fixture\CatalogProductAttribute\Options"> <default_value xsi:type="null"/> </field> <field name="default_value_text" group="advanced-properties"/> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml index 93ba98c55dd..320e99b58a4 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/CreateAttributeSetEntityTest.xml @@ -6,14 +6,14 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\CreateAttributeSetEntityTest"> - <variation name="CreateAttributeSetEntityTestVariation1"> - <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplate%isolation%</data> - <data name="attributeSet/data/skeleton_set/dataSet" xsi:type="string">default</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm"/> - </variation> - </testCase> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\CreateAttributeSetEntityTest"> + <variation name="CreateAttributeSetEntityTestVariation1"> + <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplate%isolation%</data> + <data name="attributeSet/data/skeleton_set/dataSet" xsi:type="string">default</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml index f569a5dbbd8..7597b2416ba 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateAttributeSetTest.xml @@ -6,17 +6,17 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateAttributeSetTest"> - <variation name="UpdateAttributeSetTestVariation1"> - <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplateEdit1%isolation%</data> - <data name="attributeSet/data/group" xsi:type="string">Custom-group%isolation%</data> - <data name="attributeSetOriginal/dataSet" xsi:type="string">custom_attribute_set</data> - <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateGroupOnProductForm"/> - </variation> - </testCase> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateAttributeSetTest"> + <variation name="UpdateAttributeSetTestVariation1"> + <data name="attributeSet/data/attribute_set_name" xsi:type="string">ProductTemplateEdit1%isolation%</data> + <data name="attributeSet/data/group" xsi:type="string">Custom-group%isolation%</data> + <data name="attributeSetOriginal/dataSet" xsi:type="string">custom_attribute_set</data> + <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateSuccessSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateInGrid" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateOnProductForm" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductTemplateGroupOnProductForm" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml index de42ea1eca4..0e74dfb542a 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/ProductAttribute/UpdateProductAttributeEntityTest.xml @@ -6,58 +6,48 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateProductAttributeEntityTest"> - <variation name="UpdateProductAttributeEntityTestVariation1"> - <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> - <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> - <data name="attribute/data/frontend_label" xsi:type="string">Text_Field_%isolation%</data> - <data name="attribute/data/frontend_input" xsi:type="string">-</data> - <data name="attribute/data/options/preset" xsi:type="string">-</data> - <data name="attribute/data/is_required" xsi:type="string">Yes</data> - <data name="attribute/data/attribute_code" xsi:type="string">-</data> - <data name="attribute/data/is_global" xsi:type="string">Global</data> - <data name="attribute/data/default_value_text" xsi:type="string">attribute_edited%isolation%</data> - <data name="attribute/data/is_unique" xsi:type="string">Yes</data> - <data name="attribute/data/manage_frontend_label" xsi:type="string">-</data> - <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> - <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> - <data name="attribute/data/is_filterable" xsi:type="string">-</data> - <data name="attribute/data/is_filterable_in_search" xsi:type="string">-</data> - <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">Yes</data> - <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> - <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> - <data name="isRequired" xsi:type="string">Yes</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm"/> - </variation> - <variation name="UpdateProductAttributeEntityTestVariation2"> - <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> - <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_dropdown</data> - <data name="attribute/data/frontend_label" xsi:type="string">Dropdown_%isolation%</data> - <data name="attribute/data/frontend_input" xsi:type="string">-</data> - <data name="attribute/data/options/preset" xsi:type="string">default</data> - <data name="attribute/data/is_required" xsi:type="string">Yes</data> - <data name="attribute/data/attribute_code" xsi:type="string">-</data> - <data name="attribute/data/is_global" xsi:type="string">Global</data> - <data name="attribute/data/default_value_text" xsi:type="string">-</data> - <data name="attribute/data/is_unique" xsi:type="string">Yes</data> - <data name="attribute/data/manage_frontend_label" xsi:type="string">-</data> - <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> - <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> - <data name="attribute/data/is_filterable" xsi:type="string">Filterable (with results)</data> - <data name="attribute/data/is_filterable_in_search" xsi:type="string">Yes</data> - <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">No</data> - <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> - <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> - <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> - <data name="isRequired" xsi:type="string">Yes</data> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage"/> - <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm"/> - </variation> - </testCase> + <testCase name="Magento\Catalog\Test\TestCase\ProductAttribute\UpdateProductAttributeEntityTest"> + <variation name="UpdateProductAttributeEntityTestVariation1"> + <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> + <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_text_field</data> + <data name="attribute/data/frontend_label" xsi:type="string">Text_Field_%isolation%</data> + <data name="attribute/data/is_required" xsi:type="string">Yes</data> + <data name="attribute/data/is_global" xsi:type="string">Global</data> + <data name="attribute/data/default_value_text" xsi:type="string">attribute_edited%isolation%</data> + <data name="attribute/data/is_unique" xsi:type="string">Yes</data> + <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> + <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> + <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">Yes</data> + <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> + <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> + <data name="isRequired" xsi:type="string">Yes</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> + </variation> + <variation name="UpdateProductAttributeEntityTestVariation2"> + <data name="productTemplate/dataSet" xsi:type="string">custom_attribute_set</data> + <data name="productAttributeOriginal/dataSet" xsi:type="string">attribute_type_dropdown</data> + <data name="attribute/data/frontend_label" xsi:type="string">Dropdown_%isolation%</data> + <data name="attribute/data/options/preset" xsi:type="string">default</data> + <data name="attribute/data/is_required" xsi:type="string">Yes</data> + <data name="attribute/data/is_global" xsi:type="string">Global</data> + <data name="attribute/data/is_unique" xsi:type="string">Yes</data> + <data name="attribute/data/is_searchable" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_in_advanced_search" xsi:type="string">Yes</data> + <data name="attribute/data/is_comparable" xsi:type="string">Yes</data> + <data name="attribute/data/is_filterable" xsi:type="string">Filterable (with results)</data> + <data name="attribute/data/is_filterable_in_search" xsi:type="string">Yes</data> + <data name="attribute/data/is_used_for_promo_rules" xsi:type="string">No</data> + <data name="attribute/data/is_html_allowed_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/is_visible_on_front" xsi:type="string">Yes</data> + <data name="attribute/data/used_in_product_listing" xsi:type="string">Yes</data> + <data name="attribute/data/used_for_sort_by" xsi:type="string">Yes</data> + <data name="isRequired" xsi:type="string">Yes</data> + <constraint name="Magento\Catalog\Test\Constraint\AssertProductAttributeSaveMessage" /> + <constraint name="Magento\Catalog\Test\Constraint\AssertAddedProductAttributeOnProductForm" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php index f4df8ae791b..dcc945eaafd 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Onepage/Billing.php @@ -48,8 +48,6 @@ class Billing extends Form $isShippingAddress = false ) { if ($billingAddress) { - //@TODO: MAGETWO-34756 - sleep(5); $this->fill($billingAddress); } if ($isShippingAddress) { diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php index a13c263aeab..2d8f5faf09f 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Customer/Curl.php @@ -195,23 +195,27 @@ class Curl extends AbstractCurl implements CustomerInterface */ protected function prepareAddressData(array $curlData) { + $address = []; foreach (array_keys($curlData['address']) as $key) { - $curlData['address'][$key]['_deleted'] = ''; - $curlData['address'][$key]['region'] = ''; - if (!is_array($curlData['address'][$key]['street'])) { - $street = $curlData['address'][$key]['street']; - $curlData['address'][$key]['street'] = []; - $curlData['address'][$key]['street'][] = $street; + $addressKey = 'new_' . $key; + $address[$addressKey] = $curlData['address'][$key]; + $address[$addressKey]['_deleted'] = ''; + $address[$addressKey]['region'] = ''; + if (!is_array($address[$addressKey]['street'])) { + $street = $address[$addressKey]['street']; + $address[$addressKey]['street'] = []; + $address[$addressKey]['street'][] = $street; } - if (isset($curlData['address'][$key]['default_billing'])) { - $value = $curlData['address'][$key]['default_billing'] === 'Yes' ? 'true' : 'false'; - $curlData['address'][$key]['default_billing'] = $value; + if (isset($address[$addressKey]['default_billing'])) { + $value = $address[$addressKey]['default_billing'] === 'Yes' ? 'true' : 'false'; + $address[$addressKey]['default_billing'] = $value; } - if (isset($curlData['address'][$key]['default_shipping'])) { - $value = $curlData['address'][$key]['default_shipping'] === 'Yes' ? 'true' : 'false'; - $curlData['address'][$key]['default_shipping'] = $value; + if (isset($address[$addressKey]['default_shipping'])) { + $value = $address[$addressKey]['default_shipping'] === 'Yes' ? 'true' : 'false'; + $address[$addressKey]['default_shipping'] = $value; } } + $curlData['address'] = $address; return $curlData; } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php index 6012db8cdd1..ab84bfc6935 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.php @@ -25,8 +25,8 @@ class Address extends AbstractRepository 'data' => $defaultData, ]; - $this->_data['address_US_1'] = $this->_getUS1(); - $this->_data['address_US_2'] = $this->_getUS2(); + $this->_data['US_address_1'] = $this->_getUS1(); + $this->_data['US_address_2'] = $this->_getUS2(); $this->_data['address_UK'] = $this->getAddressUK(); $this->_data['address_UK_2'] = $this->getAddressUK2(); $this->_data['address_UK_with_VAT'] = $this->getAddressUKWithVAT($this->_data['address_UK']); diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml index e379604530b..a3156dbf6ec 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml @@ -37,21 +37,6 @@ <field name="default_shipping" xsi:type="string">No</field> </dataset> - <dataset name="US_NY_address_billing"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">6262 Fifth Avenue</field> - <field name="city" xsi:type="string">New York</field> - <field name="region_id" xsi:type="string">New York</field> - <field name="postcode" xsi:type="string">90230</field> - <field name="country_id" xsi:type="string">United States</field> - <field name="telephone" xsi:type="string">555-55-555-55</field> - <field name="default_billing" xsi:type="string">No</field> - <field name="default_shipping" xsi:type="string">No</field> - </dataset> - <dataset name="US_address_default_shipping"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe</field> @@ -67,43 +52,42 @@ <field name="default_shipping" xsi:type="string">No</field> </dataset> - <dataset name="default_US_address"> + <dataset name="US_address_1"> + <field name="firstname" xsi:type="string">John</field> + <field name="lastname" xsi:type="string">Doe</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> + <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> <field name="city" xsi:type="string">Culver City</field> - <field name="region_id" xsi:type="string">California</field> + <field name="street" xsi:type="string">6161 West Centinela Avenue</field> <field name="postcode" xsi:type="string">90230</field> <field name="country_id" xsi:type="string">United States</field> + <field name="region_id" xsi:type="string">California</field> <field name="telephone" xsi:type="string">555-55-555-55</field> - <field name="default_billing" xsi:type="string">Yes</field> - <field name="default_shipping" xsi:type="string">Yes</field> </dataset> - <dataset name="US_address_without_email"> + <dataset name="US_address_1_without_email"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> <field name="city" xsi:type="string">Culver City</field> - <field name="region_id" xsi:type="string">California</field> + <field name="street" xsi:type="string">6161 West Centinela Avenue</field> <field name="postcode" xsi:type="string">90230</field> <field name="country_id" xsi:type="string">United States</field> + <field name="region_id" xsi:type="string">California</field> <field name="telephone" xsi:type="string">555-55-555-55</field> </dataset> - <dataset name="US_address_NY"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> + <dataset name="US_address_2"> + <field name="firstname" xsi:type="string">Billy</field> + <field name="lastname" xsi:type="string">Holiday</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="street" xsi:type="string">3222 Cliffside Drive</field> - <field name="city" xsi:type="string">Binghamton</field> - <field name="region_id" xsi:type="string">New York</field> - <field name="postcode" xsi:type="string">13901</field> + <field name="email" xsi:type="string">b.holliday@example.net</field> + <field name="city" xsi:type="string">New York</field> + <field name="street" xsi:type="string">727 5th Ave</field> + <field name="postcode" xsi:type="string">10022</field> <field name="country_id" xsi:type="string">United States</field> - <field name="telephone" xsi:type="string">607-481-7802</field> - <field name="default_billing" xsi:type="string">Yes</field> - <field name="default_shipping" xsi:type="string">Yes</field> + <field name="region_id" xsi:type="string">New York</field> + <field name="telephone" xsi:type="string">777-77-77-77</field> </dataset> <dataset name="US_address_TX"> @@ -121,125 +105,67 @@ <field name="default_shipping" xsi:type="string">Yes</field> </dataset> - <dataset name="customer_US"> + <dataset name="US_address_NY"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JohnDoe_%isolation%@example.com</field> + <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Culver City</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> - <field name="postcode" xsi:type="string">90230</field> + <field name="street" xsi:type="string">3222 Cliffside Drive</field> + <field name="city" xsi:type="string">Binghamton</field> + <field name="region_id" xsi:type="string">New York</field> + <field name="postcode" xsi:type="string">13901</field> <field name="country_id" xsi:type="string">United States</field> - <field name="region_id" xsi:type="string">California</field> - <field name="telephone" xsi:type="string">555-55-555-55</field> - <field name="fax" xsi:type="string">555-55-555-55</field> - </dataset> - - <dataset name="customer_UK"> - <field name="firstname" xsi:type="string">Jane</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">London</field> - <field name="street" xsi:type="string">172, Westminster Bridge Rd</field> - <field name="postcode" xsi:type="string">SE1 7RW</field> - <field name="country_id" xsi:type="string">United Kingdom</field> - <field name="region" xsi:type="string">London</field> - <field name="telephone" xsi:type="string">444-44-444-44</field> - <field name="fax" xsi:type="string">444-44-444-44</field> - </dataset> - - <dataset name="address_UK_default_billing_address"> - <field name="firstname" xsi:type="string">Jane</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">London</field> - <field name="street" xsi:type="string">172, Westminster Bridge Rd</field> - <field name="postcode" xsi:type="string">SE1 7RW</field> - <field name="country_id" xsi:type="string">United Kingdom</field> - <field name="region" xsi:type="string">London</field> - <field name="telephone" xsi:type="string">444-44-444-44</field> - <field name="fax" xsi:type="string">444-44-444-44</field> + <field name="telephone" xsi:type="string">607-481-7802</field> <field name="default_billing" xsi:type="string">Yes</field> <field name="default_shipping" xsi:type="string">Yes</field> </dataset> - <dataset name="address_US_1"> + <dataset name="US_address_NY_default_no"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe</field> - <field name="company" xsi:type="string">Magento %isolation%</field> <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> - <field name="city" xsi:type="string">Culver City</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> - <field name="postcode" xsi:type="string">90230</field> - <field name="country_id" xsi:type="string">United States</field> - <field name="region_id" xsi:type="string">California</field> - <field name="telephone" xsi:type="string">555-55-555-55</field> - </dataset> - - <dataset name="address_US_2"> - <field name="firstname" xsi:type="string">Billy</field> - <field name="lastname" xsi:type="string">Holiday</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="email" xsi:type="string">b.holliday@example.net</field> + <field name="street" xsi:type="string">6262 Fifth Avenue</field> <field name="city" xsi:type="string">New York</field> - <field name="street" xsi:type="string">727 5th Ave</field> - <field name="postcode" xsi:type="string">10022</field> - <field name="country_id" xsi:type="string">United States</field> <field name="region_id" xsi:type="string">New York</field> - <field name="telephone" xsi:type="string">777-77-77-77</field> - </dataset> - - <dataset name="address_data_US_1"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Culver City</field> - <field name="street" xsi:type="string">6161 West Centinela Avenue</field> <field name="postcode" xsi:type="string">90230</field> <field name="country_id" xsi:type="string">United States</field> - <field name="region_id" xsi:type="string">California</field> <field name="telephone" xsi:type="string">555-55-555-55</field> + <field name="default_billing" xsi:type="string">No</field> + <field name="default_shipping" xsi:type="string">No</field> </dataset> - <dataset name="address_DE"> - <field name="firstname" xsi:type="string">Jan</field> - <field name="lastname" xsi:type="string">Jansen</field> - <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Berlin</field> - <field name="street" xsi:type="string">Augsburger Strabe 41</field> - <field name="postcode" xsi:type="string">10789</field> - <field name="country_id" xsi:type="string">Germany</field> - <field name="region_id" xsi:type="string">Berlin</field> - <field name="telephone" xsi:type="string">333-33-333-33</field> - </dataset> - - <dataset name="address_UK"> + <dataset name="UK_address_default_billing"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> + <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> <field name="company" xsi:type="string">Magento %isolation%</field> <field name="city" xsi:type="string">London</field> <field name="street" xsi:type="string">172, Westminster Bridge Rd</field> <field name="postcode" xsi:type="string">SE1 7RW</field> <field name="country_id" xsi:type="string">United Kingdom</field> - <field name="region_id" xsi:type="string">London</field> + <field name="region" xsi:type="string">London</field> <field name="telephone" xsi:type="string">444-44-444-44</field> + <field name="fax" xsi:type="string">444-44-444-44</field> + <field name="default_billing" xsi:type="string">Yes</field> + <field name="default_shipping" xsi:type="string">Yes</field> </dataset> - <dataset name="address_UK_2"> + <dataset name="UK_address"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> + <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> <field name="company" xsi:type="string">Magento %isolation%</field> - <field name="city" xsi:type="string">Manchester</field> - <field name="street" xsi:type="string">42 King Street West</field> - <field name="postcode" xsi:type="string">M3 2WY</field> + <field name="city" xsi:type="string">London</field> + <field name="street" xsi:type="string">172, Westminster Bridge Rd</field> + <field name="postcode" xsi:type="string">SE1 7RW</field> <field name="country_id" xsi:type="string">United Kingdom</field> - <field name="region_id" xsi:type="string">Manchester</field> + <field name="region" xsi:type="string">London</field> <field name="telephone" xsi:type="string">444-44-444-44</field> + <field name="fax" xsi:type="string">444-44-444-44</field> </dataset> - <dataset name="address_UK_with_VAT"> + <dataset name="UK_address_with_VAT"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> <field name="company" xsi:type="string">Magento %isolation%</field> @@ -253,5 +179,17 @@ <field name="default_billing" xsi:type="string">Yes</field> <field name="default_shipping" xsi:type="string">Yes</field> </dataset> + + <dataset name="DE_address"> + <field name="firstname" xsi:type="string">Jan</field> + <field name="lastname" xsi:type="string">Jansen</field> + <field name="company" xsi:type="string">Magento %isolation%</field> + <field name="city" xsi:type="string">Berlin</field> + <field name="street" xsi:type="string">Augsburger Strabe 41</field> + <field name="postcode" xsi:type="string">10789</field> + <field name="country_id" xsi:type="string">Germany</field> + <field name="region_id" xsi:type="string">Berlin</field> + <field name="telephone" xsi:type="string">333-33-333-33</field> + </dataset> </repository> </config> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml index a3eb0e57b62..2dc95ab415c 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Customer.xml @@ -76,22 +76,6 @@ </field> </dataset> - <dataset name="customer_US"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JohnDoe_%isolation%@example.com</field> - <field name="password" xsi:type="string">123123q</field> - <field name="password_confirmation" xsi:type="string">123123q</field> - </dataset> - - <dataset name="customer_UK"> - <field name="firstname" xsi:type="string">Jane</field> - <field name="lastname" xsi:type="string">Doe</field> - <field name="email" xsi:type="string">JaneDoe_%isolation%@example.com</field> - <field name="password" xsi:type="string">123123q</field> - <field name="password_confirmation" xsi:type="string">123123q</field> - </dataset> - <dataset name="johndoe_unique"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe%isolation%</field> @@ -144,7 +128,7 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_US_1</item> + <item name="presets" xsi:type="string">US_address_1</item> </field> </dataset> @@ -158,29 +142,18 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_US_1</item> + <item name="presets" xsi:type="string">US_address_1</item> </field> </dataset> - <dataset name="customer_US_1"> - <field name="firstname" xsi:type="string">John</field> - <field name="lastname" xsi:type="string">Doe%isolation%</field> - <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> - <field name="password" xsi:type="string">123123q</field> - <field name="password_confirmation" xsi:type="string">123123q</field> - <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_US_1</item> - </field> - </dataset> - - <dataset name="customer_UK_1"> + <dataset name="customer_US"> <field name="firstname" xsi:type="string">John</field> <field name="lastname" xsi:type="string">Doe%isolation%</field> <field name="email" xsi:type="string">John.Doe%isolation%@example.com</field> <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_UK</item> + <item name="presets" xsi:type="string">US_address_1</item> </field> </dataset> @@ -191,7 +164,7 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_UK_default_billing_address</item> + <item name="presets" xsi:type="string">UK_address_default_billing</item> </field> </dataset> @@ -202,7 +175,7 @@ <field name="password" xsi:type="string">123123q</field> <field name="password_confirmation" xsi:type="string">123123q</field> <field name="address" xsi:type="array"> - <item name="presets" xsi:type="string">address_UK_with_VAT</item> + <item name="presets" xsi:type="string">UK_address_with_VAT</item> </field> </dataset> </repository> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php index 80e7a2eef28..a1e5265c36c 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 @@ -102,6 +102,6 @@ class CreateExistingCustomerFrontendEntity extends Injectable */ public function tearDown() { - $this->customerAccountLogout->open(); + $this->objectManager->create('Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep')->run(); } } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml index f998fde69cd..d4c96eef41e 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/DeleteCustomerAddressTest.xml @@ -9,7 +9,7 @@ <testCase name="Magento\Customer\Test\TestCase\DeleteCustomerAddressTest"> <variation name="DeleteCustomerAddressTestVariation1"> <data name="customer/dataSet" xsi:type="string">default</data> - <data name="customer/data/address/presets" xsi:type="string">US_address_default_billing,US_NY_address_billing</data> + <data name="customer/data/address/presets" xsi:type="string">US_address_default_billing,US_address_NY_default_no</data> <constraint name="Magento\Customer\Test\Constraint\AssertAddressDeletedFrontend"/> <constraint name="Magento\Customer\Test\Constraint\AssertAddressDeletedBackend"/> </variation> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml index 28a5aa51e2f..42e10059a89 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/ForgotPasswordOnFrontendTest.xml @@ -8,7 +8,7 @@ <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> <testCase name="Magento\Customer\Test\TestCase\ForgotPasswordOnFrontendTest"> <variation name="ForgotPasswordOnFrontendTestVariation1"> - <data name="customer/dataSet" xsi:type="string">customer_US_1</data> + <data name="customer/dataSet" xsi:type="string">customer_US</data> <constraint name="Magento\Customer\Test\Constraint\AssertCustomerForgotPasswordSuccessMessage" /> </variation> </testCase> diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php index 2892af943fd..63308bbea50 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/UpdateCustomerFrontendEntityTest.php @@ -135,14 +135,4 @@ class UpdateCustomerFrontendEntityTest extends Injectable $this->customerAddressEdit->getEditForm()->fill($address); $this->customerAddressEdit->getEditForm()->saveAddress(); } - - /** - * Customer logout from account - * - * @return void - */ - public function tearDown() - { - $this->objectManager->create('Magento\Customer\Test\TestStep\LogoutCustomerOnFrontendStep')->run(); - } } diff --git a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml index 2c81ac17aec..add7f251964 100644 --- a/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Fedex/Test/TestCase/OnePageCheckoutTest.xml @@ -11,9 +11,9 @@ <data name="description" xsi:type="string">Checkout as guest using FedEx with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="address/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="address/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="shipping/shipping_service" xsi:type="string">Federal Express</data> <data name="shipping/shipping_method" xsi:type="string">International Economy</data> <data name="cart/data/shipping_method" xsi:type="string">International Economy</data> diff --git a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml index 18f90c0f315..b6433e7ad8e 100644 --- a/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml +++ b/dev/tests/functional/tests/app/Magento/GiftMessage/Test/TestCase/CheckoutWithGiftMessagesTest.xml @@ -9,8 +9,8 @@ <testCase name="Magento\GiftMessage\Test\TestCase\CheckoutWithGiftMessagesTest"> <variation name="CheckoutWithGiftMessagesTestVariation1"> <data name="products" xsi:type="string">catalogProductSimple::default, catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="checkoutMethod" xsi:type="string">login</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -26,8 +26,8 @@ </variation> <variation name="CheckoutWithGiftMessagesTestVariation2"> <data name="products" xsi:type="string">catalogProductSimple::default, catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="checkoutMethod" xsi:type="string">login</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml index 369d359cf8a..424602ae08d 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <wrapper>order[billing_address]</wrapper> <fields> <firstname /> @@ -23,8 +23,5 @@ </region_id> <postcode /> <telephone /> - <save_in_address_book> - <input>checkbox</input> - </save_in_address_book> </fields> </mapping> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml index 768fef18f37..ece7a7be14c 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Form/Account.xml @@ -5,12 +5,12 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <wrapper>order[account]</wrapper> <fields> - <group> + <group_id> <input>select</input>> - </group> + </group_id> <email /> </fields> </mapping> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php index 03ec6f8187c..77060264e1d 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php @@ -8,6 +8,8 @@ namespace Magento\Sales\Test\Block\Adminhtml\Order\Create\Items; use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** * Class ItemProduct @@ -76,6 +78,25 @@ class ItemProduct extends Form return $result; } + /** + * Fill the root form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + if (isset($data['cartItem'])) { + unset($data['cartItem']); + } + $mapping = $this->dataMapping($data); + $this->_fill($mapping, $element); + + return $this; + } + /** * Click Configure button. * diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml index 6371ae09b99..5359e6a9513 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml @@ -10,8 +10,8 @@ <variation name="CreateOrderBackendTestVariation1"> <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Cash on Delivery payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="saveAddress" xsi:type="string">No</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -31,8 +31,8 @@ <variation name="CreateOrderBackendTestVariation2"> <data name="description" xsi:type="string">Create order with virtual product for registered UK customer using Check/Money Order payment method</data> <data name="products" xsi:type="string">catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="prices" xsi:type="array"> <item name="grandTotal" xsi:type="string">10.00</item> </data> @@ -49,8 +49,8 @@ <variation name="CreateOrderBackendTestVariation3"> <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Bank Transfer payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="saveAddress" xsi:type="string">No</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -71,8 +71,8 @@ <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create order with virtual product for registered UK customer using Bank Transfer payment method</data> <data name="products" xsi:type="string">catalogProductVirtual::default</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="saveAddress" xsi:type="string">No</data> <data name="prices" xsi:type="array"> <item name="grandTotal" xsi:type="string">10.00</item> @@ -91,9 +91,9 @@ <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Purchase Order payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">No</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> @@ -114,10 +114,10 @@ <data name="description" xsi:type="string">MAGETWO-12395 - Create Offline Order for Registered Customer in Admin</data> <data name="products" xsi:type="string">catalogProductSimple::simple_10_dollar, configurableProduct::with_one_option</data> <data name="taxRule" xsi:type="string">us_ca_ny_rule</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">No</data> <data name="checkoutMethod" xsi:type="string">login</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> @@ -132,10 +132,10 @@ <data name="description" xsi:type="string">MAGETWO-12520 - Create Order for New Customer in Admin with Offline Payment Method</data> <data name="products" xsi:type="string">catalogProductSimple::simple_10_dollar, configurableProduct::with_one_option</data> <data name="taxRule" xsi:type="string">us_ca_ny_rule</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">Yes</data> <data name="checkoutMethod" xsi:type="string">register</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml index 200b45de0ad..20b862a735e 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/ReorderOrderEntityTest.xml @@ -11,8 +11,8 @@ <data name="description" xsi:type="string">Reorder placed order (update products, billing address).</data> <data name="order/dataSet" xsi:type="string">two_simple_product</data> <data name="salesRule" xsi:type="string">active_sales_rule_with_fixed_price_discount_coupon</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> diff --git a/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml b/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml index 7e75ac518b8..bacb199390c 100644 --- a/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml +++ b/dev/tests/functional/tests/app/Magento/Shipping/Test/Block/Adminhtml/Form.xml @@ -6,7 +6,7 @@ */ --> <mapping strict="0"> - <wrapper>creditmemo</wrapper> + <wrapper>shipment</wrapper> <fields> <comment_text /> <shipping_amount /> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml index ae3c83014c7..d5407ecf878 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/ApplyTaxBasedOnVatIdTest.xml @@ -11,11 +11,11 @@ <data name="description" xsi:type="string">MAGETWO-13436: Automatic Apply Tax Based on VAT ID.</data> <data name="vatConfig/dataSet" xsi:type="string">enable_VAT_on_frontend</data> <data name="configData" xsi:type="string">default_tax_configuration, flatrate, checkmo, store_information_DE_with_VAT, enable_VAT_on_frontend</data> - <data name="customer/dataSet" xsi:type="string">address_UK_with_VAT</data> + <data name="customer/dataSet" xsi:type="string">customer_UK_address_with_VAT</data> <data name="order/dataSet" xsi:type="string">default</data> <data name="order/data/entity_id/products" xsi:type="string">catalogProductSimple::product_10_dollar</data> <data name="order/data/customer_id/dataSet" xsi:type="string">customer_UK_address_with_VAT</data> - <data name="order/data/billing_address_id/dataSet" xsi:type="string">address_UK_with_VAT</data> + <data name="order/data/billing_address_id/dataSet" xsi:type="string">UK_address_with_VAT</data> <data name="taxRule/dataSet" xsi:type="string">retailer_uk_full_tax_rule</data> <data name="customerGroup" xsi:type="string">valid_intra_union_group</data> <data name="cart/data/subtotal" xsi:type="string">10</data> diff --git a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml index 850c839e08f..fcb92ddb6be 100644 --- a/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Ups/Test/TestCase/OnePageCheckoutTest.xml @@ -11,8 +11,8 @@ <data name="description" xsi:type="string">MAGETWO-12848 – Use UPS Online Shipping Carrier on Checkout as a Registered Customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">login</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">United Parcel Service</data> <data name="shipping/shipping_method" xsi:type="string">UPS Ground</data> <data name="cart/data/shipping_method" xsi:type="string">UPS Ground</data> @@ -27,9 +27,9 @@ <data name="description" xsi:type="string">Checkout as guest using UPS with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="address/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="address/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="shipping/shipping_service" xsi:type="string">United Parcel Service</data> <data name="shipping/shipping_method" xsi:type="string">UPS Worldwide Expedited</data> <data name="cart/data/shipping_method" xsi:type="string">UPS Worldwide Expedited</data> diff --git a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml index db8db09e418..25c488a697e 100644 --- a/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml +++ b/dev/tests/functional/tests/app/Magento/Usps/Test/TestCase/OnePageCheckoutTest.xml @@ -11,8 +11,8 @@ <data name="description" xsi:type="string">MAGETWO-12444 – Use USPS Online Shipping Carrier on Checkout as a Registered Customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">login</data> - <data name="customer/dataSet" xsi:type="string">customer_US</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_US</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> <data name="shipping/shipping_service" xsi:type="string">United States Postal Service</data> <data name="shipping/shipping_method" xsi:type="string">Priority Mail 1-Day</data> <data name="cart/data/shipping_method" xsi:type="string">Priority Mail 1-Day</data> @@ -27,9 +27,9 @@ <data name="description" xsi:type="string">Checkout as guest using USPS with US shipping origin and UK customer</data> <data name="products" xsi:type="string">catalogProductSimple::default, configurableProduct::default, bundleProduct::bundle_fixed_product</data> <data name="checkoutMethod" xsi:type="string">guest</data> - <data name="customer/dataSet" xsi:type="string">customer_UK</data> - <data name="address/dataSet" xsi:type="string">customer_UK</data> - <data name="billingAddress/dataSet" xsi:type="string">customer_UK</data> + <data name="customer/dataSet" xsi:type="string">default</data> + <data name="address/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> <data name="shipping/shipping_service" xsi:type="string">United States Postal Service</data> <data name="shipping/shipping_method" xsi:type="string">Priority Mail International</data> <data name="cart/data/shipping_method" xsi:type="string">Priority Mail International</data> diff --git a/dev/tests/functional/utils/generate/constraint.php b/dev/tests/functional/utils/generate/constraint.php deleted file mode 100644 index 5dfd019f6c1..00000000000 --- a/dev/tests/functional/utils/generate/constraint.php +++ /dev/null @@ -1,9 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -require_once dirname(__DIR__) . '/' . 'bootstrap.php'; - -$objectManager->create('Magento\Mtf\Util\Generate\Constraint')->launch(); -\Magento\Mtf\Util\Generate\GenerateResult::displayResults(); -- GitLab From 2621262c063c6d2c72bfb13ef6d60ac5a3f24a0e Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 01:10:45 +0300 Subject: [PATCH 149/396] MAGETWO-38547: Implementation --- .../Component/Listing/Column/BlockActions.php | 43 ++- .../Component/Listing/Column/PageActions.php | 28 +- .../ui_component/cms_block_listing.xml | 8 +- .../ui_component/cms_page_listing.xml | 8 +- .../view/base/web/js/grid/columns/actions.js | 272 +++++++++++++++++- .../base/web/js/grid/columns/multiselect.js | 57 ++-- .../Ui/view/base/web/js/grid/massactions.js | 173 +++++++++-- .../Ui/view/base/web/js/grid/paging.js | 3 +- .../Ui/view/base/web/js/modal/alert.js | 40 +++ .../Ui/view/base/web/js/modal/confirm.js | 12 +- .../view/base/web/templates/grid/actions.html | 4 +- .../web/templates/grid/cells/actions.html | 46 ++- .../web/css/source/module/_data-grid.less | 11 +- 13 files changed, 611 insertions(+), 94 deletions(-) create mode 100644 app/code/Magento/Ui/view/base/web/js/modal/alert.js diff --git a/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php b/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php index d93cc635d9e..74a55908e27 100644 --- a/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php +++ b/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php @@ -18,7 +18,11 @@ class BlockActions extends Column /** * Url path */ - const URL_PATH = 'cms/block/edit'; + const URL_PATH_EDIT = 'cms/block/edit'; + + const URL_PATH_DELETE = 'cms/block/delete'; + + const URL_PATH_DETAILS = 'cms/block/details'; /** * @var UrlInterface @@ -45,6 +49,10 @@ class BlockActions extends Column parent::__construct($context, $uiComponentFactory, $components, $data); } + /** + * @param array $items + * @return array + */ /** * Prepare Data Source * @@ -58,12 +66,39 @@ class BlockActions extends Column if (isset($item['block_id'])) { $item[$this->getData('name')] = [ 'edit' => [ - 'href' => $this->urlBuilder->getUrl(static::URL_PATH, ['block_id' => $item['block_id']]), - 'label' => __('Edit'), + 'href' => $this->urlBuilder->getUrl( + static::URL_PATH_EDIT, + [ + 'block_id' => $item['block_id'] + ] + ), + 'label' => __('Edit') + ], + 'details' => [ + 'href' => $this->urlBuilder->getUrl( + static::URL_PATH_DETAILS, + [ + 'block_id' => $item['block_id'] + ] + ), + 'label' => __('Details') + ], + 'delete' => [ + 'href' => $this->urlBuilder->getUrl( + static::URL_PATH_DELETE, + [ + 'block_id' => $item['block_id'] + ] + ), + 'label' => __('Delete'), + 'confirm' => array( + 'title' => __('Delete "${ $.$data.title }"'), + 'message' => __('Are you sure you wan\'t to delete a "${ $.$data.title }" record?') + ) ] ]; } } } } -} +} \ No newline at end of file diff --git a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php index 59edfeded29..83400979342 100644 --- a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php +++ b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php @@ -17,7 +17,8 @@ use Magento\Framework\UrlInterface; class PageActions extends Column { /** Url path */ - const CMS_URL_PATH = 'cms/page/edit'; + const CMS_URL_PATH_EDIT = 'cms/page/edit'; + const CMS_URL_PATH_DELETE = 'cms/page/delete'; /** @var UrlBuilder */ protected $actionUrlBuilder; @@ -36,7 +37,6 @@ class PageActions extends Column * @param UrlInterface $urlBuilder * @param array $components * @param array $data - * @param string $url */ public function __construct( ContextInterface $context, @@ -44,12 +44,10 @@ class PageActions extends Column UrlBuilder $actionUrlBuilder, UrlInterface $urlBuilder, array $components = [], - array $data = [], - $url = self::CMS_URL_PATH + array $data = [] ) { $this->urlBuilder = $urlBuilder; $this->actionUrlBuilder = $actionUrlBuilder; - $this->url = $url; parent::__construct($context, $uiComponentFactory, $components, $data); } @@ -63,15 +61,23 @@ class PageActions extends Column { if (isset($dataSource['data']['items'])) { foreach ($dataSource['data']['items'] as & $item) { + $name = $this->getData('name'); if (isset($item['page_id'])) { - $item[$this->getData('name')]['edit'] = [ - 'href' => $this->urlBuilder->getUrl($this->url, ['page_id' => $item['page_id']]), - 'label' => __('Edit'), - 'hidden' => true + $item[$name]['edit'] = [ + 'href' => $this->urlBuilder->getUrl(self::CMS_URL_PATH_EDIT, ['page_id' => $item['page_id']]), + 'label' => __('Edit') + ]; + $item[$name]['delete'] = [ + 'href' => $this->urlBuilder->getUrl(self::CMS_URL_PATH_DELETE, ['page_id' => $item['page_id']]), + 'label' => __('Delete'), + 'confirm' => array( + 'title' => __('Delete "${ $.$data.title }"'), + 'message' => __('Are you sure you wan\'t to delete a "${ $.$data.title }" record?') + ) ]; } if (isset($item['identifier'])) { - $item[$this->getData('name')]['preview'] = [ + $item[$name]['preview'] = [ 'href' => $this->actionUrlBuilder->getUrl( $item['identifier'], isset($item['_first_store_id']) ? $item['_first_store_id'] : null, @@ -83,4 +89,4 @@ class PageActions extends Column } } } -} +} \ No newline at end of file diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml index 44f4c1deea2..d39e23179e3 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml @@ -225,13 +225,17 @@ <massaction name="listing_massaction"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="selectProvider" xsi:type="string">cms_block_listing.cms_block_listing.cms_block_columns.ids</item> <item name="displayArea" xsi:type="string">bottom</item> <item name="actions" xsi:type="array"> <item name="delete" xsi:type="array"> - <item name="confirm" xsi:type="string" translate="true">Are you sure you want to perform this action?</item> <item name="type" xsi:type="string">delete</item> <item name="label" xsi:type="string" translate="true">Delete</item> <item name="url" xsi:type="string">cms/block/massDelete</item> + <item name="confirm" xsi:type="array"> + <item name="title" xsi:type="string" translate="true">Delete items</item> + <item name="message" xsi:type="string" translate="true">Are you sure you wan't to delete selected items?</item> + </item> </item> </item> <item name="indexField" xsi:type="string">block_id</item> @@ -245,6 +249,7 @@ <item name="provider" xsi:type="string">cms_block_listing.cms_block_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.paging</item> </item> + <item name="selectProvider" xsi:type="string">cms_block_listing.cms_block_listing.cms_block_columns.ids</item> <item name="displayArea" xsi:type="string">bottom</item> <item name="options" xsi:type="array"> <item name="20" xsi:type="array"> @@ -398,6 +403,7 @@ <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">actions</item> + <item name="indexField" xsi:type="string">block_id</item> <item name="align" xsi:type="string">left</item> <item name="label" xsi:type="string" translate="true">Action</item> <item name="data_type" xsi:type="string">actions</item> diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml index 7d154b524cd..3c19423fe13 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_page_listing.xml @@ -237,13 +237,17 @@ <massaction name="listing_massaction"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="selectProvider" xsi:type="string">cms_page_listing.cms_page_listing.cms_page_columns.ids</item> <item name="displayArea" xsi:type="string">bottom</item> <item name="actions" xsi:type="array"> <item name="delete" xsi:type="array"> - <item name="confirm" xsi:type="string" translate="true">Delete selected items?</item> <item name="type" xsi:type="string">delete</item> <item name="label" xsi:type="string" translate="true">Delete</item> <item name="url" xsi:type="string">cms/page/massDelete</item> + <item name="confirm" xsi:type="array"> + <item name="title" xsi:type="string" translate="true">Delete items</item> + <item name="message" xsi:type="string" translate="true">Are you sure you wan't to delete selected items?</item> + </item> </item> <item name="disable" xsi:type="array"> <item name="type" xsi:type="string">disable</item> @@ -267,6 +271,7 @@ <item name="provider" xsi:type="string">cms_page_listing.cms_page_listing.listing_top.bookmarks</item> <item name="namespace" xsi:type="string">current.paging</item> </item> + <item name="selectProvider" xsi:type="string">cms_page_listing.cms_page_listing.cms_page_columns.ids</item> <item name="displayArea" xsi:type="string">bottom</item> <item name="options" xsi:type="array"> <item name="20" xsi:type="array"> @@ -507,6 +512,7 @@ <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="dataType" xsi:type="string">actions</item> + <item name="indexField" xsi:type="string">page_id</item> <item name="align" xsi:type="string">left</item> <item name="label" xsi:type="string" translate="true">Action</item> <item name="data_type" xsi:type="string">actions</item> diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js index 33a095e64e8..f4e429a4dc1 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js @@ -4,24 +4,280 @@ */ define([ 'underscore', - './column' -], function (_, Column) { + 'mageUtils', + 'uiRegistry', + './column', + 'Magento_Ui/js/modal/confirm' +], function (_, utils, registry, Column, confirm) { 'use strict'; return Column.extend({ defaults: { headerTmpl: 'ui/grid/columns/actions', - bodyTmpl: 'ui/grid/cells/actions' + bodyTmpl: 'ui/grid/cells/actions', + actions: [], + templates: {}, + rowsProvider: '${ $.parentName }', + imports: { + rows: '${ $.rowsProvider }:rows' + }, + listens: { + rows: 'updateActions' + } }, - getDisplayed: function (actions) { - actions = _.filter(actions, function (action) { - return !('hidden' in action) || !action.hidden; + /** + * Initializes observable properties. + * + * @returns {ActionsColumn} Chainable. + */ + initObservable: function () { + this._super() + .observe('actions opened'); + + return this; + }, + + /** + * Returns specific action of a specified row + * or all action objects associated with it. + * + * @param {Number} rowIndex - Index of a row. + * @param {String} [actionIndex] + * @returns {Array|Object} + */ + getAction: function (rowIndex, actionIndex) { + var rowActions = this.actions()[rowIndex]; + + return rowActions && actionIndex ? + rowActions[actionIndex] : + rowActions; + }, + + /** + * Returns visible actions for a specified row. + * + * @param {Number} rowIndex - Index of a row. + * @returns {Array} Visible actions. + */ + getVisibleActions: function (rowIndex) { + var rowActions = this.getAction(rowIndex); + + return _.filter(rowActions, this.isActionVisible, this); + }, + + /** + * Adds new action. If action with a specfied identifier + * already exists, than the original will be overrided. + * + * @param {String} index - Actions' identifier. + * @param {Object} action - Actions' data. + * @returns {ActionsColumn} Chainable. + */ + addAction: function (index, action) { + var actionTmpls = this.templates.actions; + + actionTmpls[index] = action; + + this.updateActions(); + + return this; + }, + + /** + * Recreates actions for each row. + * + * @returns {ActionsColumn} Chainable. + */ + updateActions: function () { + var rows = this.rows, + actions = rows.map(this._formatActions, this); + + this.actions(actions); + + return this; + }, + + /** + * Processes actions, setting additional information to them and + * evaluating ther properties as a string templates. + * + * @private + * @param {Object} row - Row object. + * @param {Number} rowIndex - Index of a row. + * @returns {Array} + */ + _formatActions: function (row, rowIndex) { + var rowActions = row[this.index], + recordId = row[this.indexField], + customActions = this.templates.customActions; + + /** + * Actions iterator. + */ + function iterate(action, index) { + action = utils.extend({ + index: index, + rowIndex: rowIndex, + recordId: recordId + }, action); + + return utils.template(action, row, true); + } + + rowActions = _.mapObject(rowActions, iterate); + customActions = _.map(customActions, iterate); + + customActions.forEach(function (action) { + rowActions[action.index] = action; + }); + + return rowActions; + }, + + /** + * Applies specified action. + * + * @param {String} actionIndex - Actions' identifier. + * @param {Number} rowIndex - Index of a row. + * @returns {ActionsColumn} Chainable. + */ + applyAction: function (actionIndex, rowIndex) { + var action = this.getAction(rowIndex, actionIndex), + callback; + + if (!action.href && !action.callback) { + return this; + } + + callback = this._getCallback(action); + + action.confirm ? + this._confirm(action, callback) : + callback(); + + return this; + }, + + /** + * Creates action callback based on its' data. If action doesn't spicify + * a callback function than the default one will be used. + * + * @private + * @param {Object} action - Actions' object. + * @returns {Function} Callback function. + */ + _getCallback: function (action) { + var args = [action.index, action.recordId, action], + callback = action.callback; + + if (_.isObject(callback)) { + args.unshift(callback.target); + + callback = registry.async(callback.provider); + } else if (!_.isFunction(callback)) { + callback = this.defaultCallback.bind(this); + } + + return function () { + callback.apply(null, args); + }; + }, + + /** + * Default action callback. Redirects to + * the specified in actions' data url. + * + * @param {String} actionIndex - Actions' identifier. + * @param {(Number|String)} recordId - Id of the record accociated + * with a specfied action. + * @param {Object} action - Actions' data. + */ + defaultCallback: function (actionIndex, recordId, action) { + window.location.href = action.href; + }, + + /** + * Shows actions' confirmation window. + * + * @param {Object} action - Actions' data. + * @param {Function} callback - Callback that will be + * invoked if action is confirmed. + */ + _confirm: function (action, callback) { + var confirmData = action.confirm; + + confirm({ + title: confirmData.title, + content: confirmData.message, + actions: { + confirm: callback + } }); + }, + + /** + * Checks if row has only one visible action. + * + * @param {Number} rowIndex - Row index. + * @returns {Boolean} + */ + isSingle: function (rowIndex) { + return this.getVisibleActions(rowIndex).length === 1; + }, + + /** + * Checks if row has more than one visible action. + * + * @param {Number} rowIndex - Row index. + * @returns {Boolean} + */ + isMultiple: function (rowIndex) { + return this.getVisibleActions(rowIndex).length > 1; + }, + + /** + * Checks if action should be displayed. + * + * @param {Object} action - Action object. + * @returns {Boolean} + */ + isActionVisible: function (action) { + return action.hidden !== true; + }, + + /** + * Opens or closes specific actions list. + * + * @param {Number} rowIndex - Index of a row, + * where actions are displayed. + * @returns {ActionsColumn} Chainable. + */ + toggleList: function (rowIndex) { + var state = false; + + if (rowIndex !== this.opened()) { + state = rowIndex; + } + + this.opened(state); + + return this; + }, - this.displayed = actions; + /** + * Closes actions list. + * + * @param {Number} rowIndex - Index of a row, + * where actions are displayed. + * @returns {ActionsColumn} + */ + closeList: function (rowIndex) { + if (this.opened() === rowIndex) { + this.opened(false); + } - return actions; + return this; } }); }); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js index e6b33d1e628..fd23ae4c0c4 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/multiselect.js @@ -19,7 +19,6 @@ define([ indetermine: false, selected: [], excluded: [], - ns: '${ $.provider }:params', actions: [{ value: 'selectAll', label: $t('Select all') @@ -40,13 +39,9 @@ define([ }, listens: { - '${ $.ns }.filters': 'deselectAll', + '${ $.provider }:params.filters': 'deselectAll', selected: 'onSelectedChange', rows: 'onRowsChange' - }, - - modules: { - source: '${ $.provider }' } }, @@ -209,18 +204,17 @@ define([ }, /** - * Exports selections to the data provider. + * Returns selections data. + * + * @returns {Object} */ - exportSelections: function () { - var data = {}, - type; - - type = this.excludeMode() ? 'excluded' : 'selected'; - - data[type] = this[type](); - data.total = this.totalSelected(); - - this.source('set', 'config.multiselect', data); + getSelections: function () { + return { + excluded: this.excluded(), + selected: this.selected(), + total: this.totalSelected(), + excludeMode: this.excludeMode() + }; }, /** @@ -231,27 +225,27 @@ define([ */ isActionRelevant: function (actionId) { var pageIds = this.getIds().length, - multiplePages = pageIds < this.totalRecords(); + multiplePages = pageIds < this.totalRecords(), + result = true; switch (actionId) { case 'selectPage': - - return multiplePages && !this.isPageSelected(true); + result = multiplePages && !this.isPageSelected(true); + break; case 'deselectPage': - - return multiplePages && this.isPageSelected(); + result = multiplePages && this.isPageSelected(); + break; case 'selectAll': - - return !this.allSelected(); + result = !this.allSelected(); + break; case 'deselectAll': - - return this.totalSelected() > 0; + result = this.totalSelected() > 0; } - return true; + return result; }, /** @@ -316,8 +310,7 @@ define([ onSelectedChange: function (selected) { this.updateExcluded(selected) .countSelected() - .updateState() - .exportSelections(); + .updateState(); }, /** @@ -325,12 +318,12 @@ define([ * based on "selectMode" property. */ onRowsChange: function () { - var newSelected; + var newSelections; if (this.excludeMode()) { - newSelected = _.union(this.getIds(true), this.selected()); + newSelections = _.union(this.getIds(true), this.selected()); - this.selected(newSelected); + this.selected(newSelections); } } }); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js index 35c792feaba..6ea30ba002e 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js @@ -5,36 +5,177 @@ define([ 'underscore', 'mageUtils', - 'Magento_Ui/js/lib/collapsible' -], function (_, utils, Collapsible) { + 'uiRegistry', + 'Magento_Ui/js/lib/collapsible', + 'Magento_Ui/js/modal/confirm', + 'Magento_Ui/js/modal/alert', + 'mage/translate' +], function (_, registry, utils, Collapsible, confirm, alert, $t) { 'use strict'; return Collapsible.extend({ defaults: { template: 'ui/grid/actions', - noItems: 'You haven\'t selected any items!' + selectProvider: '', + actions: [], + noItemsMsg: $t('You haven\'t selected any items!'), + modules: { + selections: '${ $.selectProvider }' + } }, - applyAction: function (action) { - var proceed = true, - selections = this.source.get('config.multiselect'); + /** + * Initializes observable properties. + * + * @returns {Massactions} Chainable. + */ + initObservable: function () { + this._super() + .observe('actions'); + + return this; + }, - if (!selections || !selections.total) { - proceed = false; + /** + * Applies specified action. + * + * @param {String} actionIndex - Actions' identifier. + * @returns {Massactions} Chainable. + */ + applyAction: function (actionIndex) { + var data = this.getSelections(), + action, + callback; - alert(this.noItems); - } + if (!data.total) { + alert({ + content: this.noItemsMsg + }); - if (proceed && action.confirm) { - proceed = window.confirm(action.confirm); + return this; } - if (proceed) { - utils.submit({ - url: action.url, - data: selections + action = this.getAction(actionIndex), + callback = this._getCallback(action, data); + + action.confirm ? + this._confirm(action, callback) : + callback(); + + return this; + }, + + /** + * Retrieves selections data from the selections provider. + * + * @returns {Object|Undefined} + */ + getSelections: function () { + var provider = this.selections(), + selections = provider && provider.getSelections(); + + return selections; + }, + + /** + * Retrieves action object associated with a specified index. + * + * @param {String} actionIndex - Actions' identifier. + * @returns {Object} Action object. + */ + getAction: function (actionIndex) { + return _.findWhere(this.actions(), { + type: actionIndex + }); + }, + + /** + * Adds new action. If action with a specfied identifier + * already exists, than the original one will be overrided. + * + * @param {Object} action - Action object. + * @returns {Massactions} Chainable. + */ + addAction: function (action) { + var actions = this.actions(), + index = _.findIdnex(actions, { + type: action.type }); + + ~index ? + actions[index] = action : + actions.push(action); + + this.actions(actions); + + return this; + }, + + /** + * Creates action callback based on its' data. If action doesn't spicify + * a callback function than the default one will be used. + * + * @private + * @param {Object} action - Actions' object. + * @param {Object} selections - Selections data. + * @returns {Function} Callback function. + */ + _getCallback: function (action, selections) { + var callback = action.callback, + args = [action, selections]; + + if (_.isObject(callback)) { + args.unshift(callback.target); + + callback = registry.async(callback.provider); + } else if (!_.isFunction(callback)) { + callback = this.defaultCallback.bind(this); } + + return function () { + callback.apply(null, args); + }; + }, + + /** + * Default action callback. Sends selections data + * via POST request. + * + * @param {Object} data - Selections data. + * @param {Object} action - Action data. + */ + defaultCallback: function (data, action) { + var selections = {}; + + if (data.excludeMode) { + selections.excluded = data.excluded; + } else { + selections.selected = data.selected; + } + + utils.submit({ + url: action.url, + data: selections + }); + }, + + /** + * Shows actions' confirmation window. + * + * @param {Object} action - Actions' data. + * @param {Function} callback - Callback that will be + * invoked if action is confirmed. + */ + _confirm: function (action, callback) { + var confirmData = action.confirm; + + confirm({ + title: confirmData.title, + content: confirmData.message, + actions: { + confirm: callback + } + }); } }); }); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/paging.js b/app/code/Magento/Ui/view/base/web/js/grid/paging.js index e04597379af..0fd512c3ffc 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/paging.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/paging.js @@ -23,9 +23,10 @@ define([ template: 'ui/grid/paging', pageSize: 20, current: 1, + selectProvider: '', imports: { - totalSelected: '${ $.provider }:config.multiselect.total', + totalSelected: '${ $.selectProvider }:totalSelected', totalRecords: '${ $.provider }:data.totalRecords' }, diff --git a/app/code/Magento/Ui/view/base/web/js/modal/alert.js b/app/code/Magento/Ui/view/base/web/js/modal/alert.js new file mode 100644 index 00000000000..33be3c8041d --- /dev/null +++ b/app/code/Magento/Ui/view/base/web/js/modal/alert.js @@ -0,0 +1,40 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +define([ + 'jquery', + 'underscore', + 'jquery/ui', + 'Magento_Ui/js/modal/confirm', + 'mage/translate' +], function ($, _) { + 'use strict'; + + $.widget('mage.alert', $.mage.confirm, { + options: { + modalClass: 'confirm', + title: $.mage.__('Attention'), + actions: { + always: function () {} + }, + buttons: [{ + text: $.mage.__('OK'), + class: 'action-secondary', + click: function () { + this.closeModal(true); + } + }] + }, + closeModal: function () { + this.options.actions.always(); + this.element.bind('confirmclosed', _.bind(this._remove, this)); + + return this._super(); + } + }); + + return function (config) { + return $('<div></div>').html(config.content).alert(config); + }; +}); diff --git a/app/code/Magento/Ui/view/base/web/js/modal/confirm.js b/app/code/Magento/Ui/view/base/web/js/modal/confirm.js index 1769010d58b..7bad2023b64 100644 --- a/app/code/Magento/Ui/view/base/web/js/modal/confirm.js +++ b/app/code/Magento/Ui/view/base/web/js/modal/confirm.js @@ -4,28 +4,30 @@ */ define([ 'jquery', + 'underscore', 'jquery/ui', 'Magento_Ui/js/modal/modal', 'mage/translate' -], function($) { +], function ($, _) { 'use strict'; $.widget('mage.confirm', $.mage.modal, { options: { modalClass: 'confirm', + title: '', actions: { always: function(){}, confirm: function(){}, cancel: function(){} }, buttons: [{ - text: $.mage.__('No'), + text: $.mage.__('Cancel'), class: 'action-tertiary', click: function(){ this.closeModal(); } - },{ - text: $.mage.__('Yes'), + }, { + text: $.mage.__('OK'), class: 'action-secondary', click: function() { this.closeModal(true); @@ -58,7 +60,7 @@ define([ } }); - return function(config) { + return function (config) { return $('<div></div>').html(config.content).confirm(config); }; }); diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/actions.html b/app/code/Magento/Ui/view/base/web/templates/grid/actions.html index 685936aa843..89bf5ba4061 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/actions.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/actions.html @@ -18,8 +18,8 @@ <ul class="action-menu" data-bind="css: {'_active': opened}, - foreach: {data: actions, as: 'action'}"> - <li data-bind="click: $parent.applyAction.bind($parent, action)"> + foreach: actions"> + <li data-bind="click: $parent.applyAction.bind($parent, type)"> <span class="action-menu-item" data-bind="text: label"></span> diff --git a/app/code/Magento/Ui/view/base/web/templates/grid/cells/actions.html b/app/code/Magento/Ui/view/base/web/templates/grid/cells/actions.html index 67f195377c6..85fba7ed0c6 100644 --- a/app/code/Magento/Ui/view/base/web/templates/grid/cells/actions.html +++ b/app/code/Magento/Ui/view/base/web/templates/grid/cells/actions.html @@ -6,25 +6,47 @@ --> <td data-bind="visible: visible" class="data-grid-actions-cell"> - <!-- ko if: getDisplayed(row[field.index]).length > 1 --> - <div class="action-select-wrap _active"> - <button class="action-select"> + <!-- ko if: isSingle($parentContext.$index()) --> + <!-- ko foreach: getVisibleActions($parentContext.$index()) --> + <a + class="action-menu-item" + data-bind=" + attr: { + href: $data.href + }, + click: $parent.applyAction.bind($parent, index, rowIndex), + text: $data.label"></a> + <!-- /ko --> + <!-- /ko --> + + <!-- ko if: isMultiple($parentContext.$index()) --> + <div + class="action-select-wrap" + data-bind=" + css : { + '_active' : opened() === $parentContext.$index() + }, + outerClick: closeList.bind($data, $parentContext.$index())"> + <button class="action-select" data-bind="click: toggleList.bind($data, $parentContext.$index())"> <span data-bind="text: $t('Select')"></span> </button> - <ul class="action-menu _active"> + <ul + class="action-menu" + data-bind=" + css: {'_active': opened() === $parentContext.$index()}"> + <!-- ko foreach: getVisibleActions($parentContext.$index()) --> <li> <a class="action-menu-item" - data-bind="attr: {href: displayed[0].href}, - text: displayed[0].label"></a> + data-bind=" + attr: { + href: $data.href + }, + click: $parent.applyAction.bind($parent, index, rowIndex), + text: $data.label"></a> </li> + <!-- /ko --> </ul> </div> <!-- /ko --> - <!-- ko ifnot: getDisplayed(row[field.index]).length > 1 --> - <a - class="action-menu-item" - data-bind="attr: {href: displayed[0].href}, - text: displayed[0].label"></a> - <!-- /ko --> </td> diff --git a/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less b/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less index d3ef739a943..d78c81e2c09 100644 --- a/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less +++ b/app/design/adminhtml/Magento/backend/Magento_Ui/web/css/source/module/_data-grid.less @@ -154,7 +154,11 @@ &:last-child { border-right-style: @data-grid-td__border-outer-style; } + // Action select data grid styles (can be action-select-secondary in future) + .action-select-wrap { + position: static; + } .action-select { .link-pattern(); background-color: transparent; @@ -168,6 +172,9 @@ } &:after { border-color: @link__color transparent transparent transparent; + margin: .6rem 0 0 .7rem; + right: auto; + top: auto; } &:before { display: none; @@ -175,6 +182,8 @@ } .action-menu { left: auto; + right: auto; + top: auto; z-index: 1; } } @@ -349,4 +358,4 @@ &._col-xs { width: 1%; } -} +} \ No newline at end of file -- GitLab From b7816a8014df377752147c8d86a47ba79a7377b5 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Fri, 12 Jun 2015 19:37:53 +0300 Subject: [PATCH 150/396] MAGETWO-38625: Fixing bugs --- lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 3c5e7618339..682d669c855 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -396,8 +396,9 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface protected function _checkDdlTransaction($sql) { if (is_string($sql) && $this->getTransactionLevel() > 0) { - $startSql = strtolower(substr(ltrim($sql), 0, 3)); - if (in_array($startSql, $this->_ddlRoutines)) { + $sqlMessage = explode(' ', $sql, 3); + $startSql = strtolower(substr(ltrim($sqlMessage[0]), 0, 3)); + if (in_array($startSql, $this->_ddlRoutines) && ($sqlMessage[1] != 'TEMPORARY')) { trigger_error(AdapterInterface::ERROR_DDL_MESSAGE, E_USER_ERROR); } } -- GitLab From 8a140df8942f8b09fccaeb6ca219371a73b92645 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Mon, 15 Jun 2015 11:28:20 +0300 Subject: [PATCH 151/396] MAGETWO-38625: Fixing bugs --- lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 682d669c855..94cbf428fd0 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -398,7 +398,7 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface if (is_string($sql) && $this->getTransactionLevel() > 0) { $sqlMessage = explode(' ', $sql, 3); $startSql = strtolower(substr(ltrim($sqlMessage[0]), 0, 3)); - if (in_array($startSql, $this->_ddlRoutines) && ($sqlMessage[1] != 'TEMPORARY')) { + if (in_array($startSql, $this->_ddlRoutines) && strcasecmp($sqlMessage[1], 'temporary') !== 0) { trigger_error(AdapterInterface::ERROR_DDL_MESSAGE, E_USER_ERROR); } } -- GitLab From 06a3f07b894864c817044369075026653971354e Mon Sep 17 00:00:00 2001 From: Dmytro Bursak <dbursak@ebay.com> Date: Mon, 15 Jun 2015 12:16:11 +0300 Subject: [PATCH 152/396] MTA-2319: [PS] Backend module functional tests maintenance --- .../app/Magento/Backend/Test/TestCase/NavigateMenuTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php index b8d486de23c..2e4509a1e66 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/NavigateMenuTest.php @@ -13,7 +13,7 @@ use Magento\Backend\Test\Page\Adminhtml\Dashboard; * Steps: * 1. Log in to backend. * 2. Navigate throught menu to the page. - * 6. Perform asserts. + * 3. Perform asserts. * * @ZephyrId MAGETWO-34874 */ -- GitLab From 0a720d42778cfcf56a8ca3b995963f200b1f953f Mon Sep 17 00:00:00 2001 From: Vitaliy Honcharenko <vgoncharenko@ebay.com> Date: Mon, 15 Jun 2015 12:35:37 +0300 Subject: [PATCH 153/396] MTA-2340: Catalog module functional tests maintenance. Category & Product - change code style --- .../Tab/Super/Config/Attribute/AttributeSelector.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php index d3c32d608a1..8d3e73f5f5f 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php @@ -21,12 +21,9 @@ class AttributeSelector extends SuggestElement */ public function waitResult() { - $browser = $this; - $selector = $this->searchResult; - $browser->waitUntil( - function () use ($browser, $selector) { - $element = $browser->find($selector); - return $element->isVisible() ? true : null; + $this->waitUntil( + function () { + return $this->find($this->searchResult)->isVisible() ? true : null; } ); } -- GitLab From 18ac7f639b14138eccff9d9a6d642eca57fd9348 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 12:47:16 +0300 Subject: [PATCH 154/396] MAGETWO-38255: Stabilize story after QA - Static tests fixes --- .../Cms/Ui/Component/Listing/Column/BlockActions.php | 8 +++----- .../Cms/Ui/Component/Listing/Column/PageActions.php | 10 +++------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php b/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php index 74a55908e27..617af42cb61 100644 --- a/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php +++ b/app/code/Magento/Cms/Ui/Component/Listing/Column/BlockActions.php @@ -19,9 +19,7 @@ class BlockActions extends Column * Url path */ const URL_PATH_EDIT = 'cms/block/edit'; - const URL_PATH_DELETE = 'cms/block/delete'; - const URL_PATH_DETAILS = 'cms/block/details'; /** @@ -91,14 +89,14 @@ class BlockActions extends Column ] ), 'label' => __('Delete'), - 'confirm' => array( + 'confirm' => [ 'title' => __('Delete "${ $.$data.title }"'), 'message' => __('Are you sure you wan\'t to delete a "${ $.$data.title }" record?') - ) + ] ] ]; } } } } -} \ No newline at end of file +} diff --git a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php index 83400979342..c28a8d4d070 100644 --- a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php +++ b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php @@ -26,10 +26,6 @@ class PageActions extends Column /** @var UrlInterface */ protected $urlBuilder; - /** @var string */ - private $url; - - /** * @param ContextInterface $context * @param UiComponentFactory $uiComponentFactory @@ -70,10 +66,10 @@ class PageActions extends Column $item[$name]['delete'] = [ 'href' => $this->urlBuilder->getUrl(self::CMS_URL_PATH_DELETE, ['page_id' => $item['page_id']]), 'label' => __('Delete'), - 'confirm' => array( + 'confirm' => [ 'title' => __('Delete "${ $.$data.title }"'), 'message' => __('Are you sure you wan\'t to delete a "${ $.$data.title }" record?') - ) + ] ]; } if (isset($item['identifier'])) { @@ -89,4 +85,4 @@ class PageActions extends Column } } } -} \ No newline at end of file +} -- GitLab From c5e765e680629e92bb0673623cc732dda08eace6 Mon Sep 17 00:00:00 2001 From: Vitaliy Honcharenko <vgoncharenko@ebay.com> Date: Mon, 15 Jun 2015 12:53:22 +0300 Subject: [PATCH 155/396] MTA-2324: Cms module functional tests maintenance --- .../app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml | 1 - .../app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php | 1 - .../app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml | 1 - .../app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml | 1 - .../app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php | 1 - 5 files changed, 5 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml index 2e1583ed1df..a6fb5bb0452 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsBlockEntityTest.xml @@ -18,7 +18,6 @@ <constraint name="Magento\Cms\Test\Constraint\AssertCmsBlockOnCategoryPage" /> </variation> <variation name="CreateCmsBlockEntityTestVariation2"> - <data name="issue" xsi:type="string">Bug: MAGETWO-35059</data> <data name="cmsBlock/data/title" xsi:type="string">block_%isolation%</data> <data name="cmsBlock/data/identifier" xsi:type="string">identifier_%isolation%</data> <data name="cmsBlock/data/stores/dataSet/option_0" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php index 60e0ea23b85..58c089face0 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php @@ -29,7 +29,6 @@ class CreateCmsPageEntityTest extends Injectable const MVP = 'yes'; const DOMAIN = 'PS'; const TEST_TYPE = 'acceptance_test'; - const TO_MAINTAIN = 'yes'; /* end tags */ /** diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml index 21c9773ef8a..c59eaa09795 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml @@ -27,7 +27,6 @@ <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageForm" /> </variation> <variation name="CreateCmsPageEntityTestVariation3"> - <data name="issue" xsi:type="string">Bug: MAGETWO-34858</data> <data name="description" xsi:type="string">Create page with widget and system variable</data> <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> <data name="cms/data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml index 472e5a65586..048ff19fc06 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsBlockEntityTest.xml @@ -18,7 +18,6 @@ <constraint name="Magento\Cms\Test\Constraint\AssertCmsBlockOnCategoryPage" /> </variation> <variation name="UpdateCmsBlockEntityTestVariation2"> - <data name="issue" xsi:type="string">Bug: MAGETWO-35059</data> <data name="cmsBlock/data/title" xsi:type="string">block_updated_%isolation%</data> <data name="cmsBlock/data/identifier" xsi:type="string">identifier_updated_%isolation%</data> <data name="cmsBlock/data/stores/dataSet/option_0" xsi:type="string">default</data> diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php index 8da0baf1779..4c8f8d1cf29 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/UpdateCmsPageEntityTest.php @@ -32,7 +32,6 @@ class UpdateCmsPageEntityTest extends Injectable /* tags */ const MVP = 'yes'; const DOMAIN = 'PS'; - const STABLE = 'no'; /* end tags */ /** -- GitLab From b469c66237a8577cee24b773b510547016b4c4a4 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Mon, 15 Jun 2015 13:35:31 +0300 Subject: [PATCH 156/396] MAGETWO-38156: Move gift message to cart --- .../Magento/GiftMessage/Model/GiftMessageConfigProvider.php | 4 ++-- .../GiftMessage/view/frontend/web/js/model/gift-message.js | 1 - .../view/frontend/web/template/gift-message-form.html | 4 ---- .../view/frontend/web/template/gift-message-item-level.html | 2 ++ .../GiftMessage/view/frontend/web/template/gift-message.html | 4 +++- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index d2966bc9076..63337f76af3 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -81,7 +81,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface ); if ($orderLevelGiftMessageConfiguration) { $orderMessages = $this->getOrderLevelGiftMessages(); - $configuration['isOrderLevelGiftOptionsEnabled'] = $this->isQuoteVirtual() ? false : true; + $configuration['isOrderLevelGiftOptionsEnabled'] = (bool)$this->isQuoteVirtual() ? false : true; $configuration['giftMessage']['orderLevel'] = $orderMessages === null ? true : $orderMessages->getData(); } if ($itemLevelGiftMessageConfiguration) { @@ -125,7 +125,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface */ protected function isQuoteVirtual() { - return $this->checkoutSession->loadCustomerQuote()->getQuote()->isVirtual(); + return $this->checkoutSession->loadCustomerQuote()->getQuote()->getIsVirtual(); } /** 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 8065bb834d1..079f47cb82b 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 @@ -93,7 +93,6 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], ); } }); - console.log('params', params); return params; } }; 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 index b0ef5560e3a..31cbc7e111a 100644 --- 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 @@ -5,13 +5,10 @@ */ --> <div class="gift-message"> - <!-- ko if: isActive() --> <div class="gift-options-title"> <span data-bind="text: $t('Gift Message (optional)')"></span> </div> - <!-- /ko --> <div class="gift-options-content"> - <!-- ko if: isActive() --> <fieldset class="fieldset"> <div class="field field-to"> <label for="gift-message-whole-to" class="label"> @@ -48,7 +45,6 @@ </div> </div> </fieldset> - <!-- /ko --> <div class="actions-toolbar"> <div class="secondary"> <button type="submit" class="action secondary action-update" data-bind=" 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 index 92aed6c141c..3fc56dbbc3e 100644 --- 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 @@ -4,6 +4,7 @@ * See COPYING.txt for license details. */ --> +<!-- ko if: isActive() --> <a href="#" class="action action-gift" data-bind=" @@ -50,3 +51,4 @@ <!-- /ko --> </div> </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 index 07dc26d9a5e..2ac79801d73 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -4,6 +4,7 @@ * See COPYING.txt for license details. */ --> +<!-- ko if: isActive() --> <div class="cart-gift-item"> <div class="gift-item-block block" data-collapsible="true" @@ -47,4 +48,5 @@ </div> </div> </div> -</div> \ No newline at end of file +</div> +<!-- /ko --> \ No newline at end of file -- GitLab From b03080d01387557e52a27e5d53cbdd94cd190d3e Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Mon, 15 Jun 2015 13:40:20 +0300 Subject: [PATCH 157/396] MAGNSWTCH-139: PR stabilization --- composer.json | 1 - dev/tests/static/testsuite/Magento/Test/Legacy/LayoutTest.php | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 76d5a7afa09..16c402a5485 100644 --- a/composer.json +++ b/composer.json @@ -132,7 +132,6 @@ "magento/module-shipping": "self.version", "magento/module-sitemap": "self.version", "magento/module-store": "self.version", - "magento/module-swatches": "self.version", "magento/module-tax": "self.version", "magento/module-tax-import-export": "self.version", "magento/module-theme": "self.version", diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/LayoutTest.php b/dev/tests/static/testsuite/Magento/Test/Legacy/LayoutTest.php index 28353e7f953..751ffc6cb8c 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/LayoutTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/LayoutTest.php @@ -349,7 +349,8 @@ class LayoutTest extends \PHPUnit_Framework_TestCase 'setWrapperClass', 'unsetChild', 'unsetChildren', - 'updateButton' + 'updateButton', + 'setIsProductListingContext' ]; } } -- GitLab From 29b536e8299192e531cc2695f16b06c5e3c9167e Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 13:46:24 +0300 Subject: [PATCH 158/396] MAGETWO-38255: Stabilize story after QA - Tests fixes --- .../Cms/Ui/Component/Listing/Column/PageActions.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php index c28a8d4d070..33a11731d45 100644 --- a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php +++ b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php @@ -26,6 +26,9 @@ class PageActions extends Column /** @var UrlInterface */ protected $urlBuilder; + /** @var string */ + private $url; + /** * @param ContextInterface $context * @param UiComponentFactory $uiComponentFactory @@ -33,6 +36,7 @@ class PageActions extends Column * @param UrlInterface $urlBuilder * @param array $components * @param array $data + * @param string $url */ public function __construct( ContextInterface $context, @@ -40,10 +44,12 @@ class PageActions extends Column UrlBuilder $actionUrlBuilder, UrlInterface $urlBuilder, array $components = [], - array $data = [] + array $data = [], + $url = self::CMS_URL_PATH_EDIT ) { $this->urlBuilder = $urlBuilder; $this->actionUrlBuilder = $actionUrlBuilder; + $this->url = $url; parent::__construct($context, $uiComponentFactory, $components, $data); } @@ -60,7 +66,7 @@ class PageActions extends Column $name = $this->getData('name'); if (isset($item['page_id'])) { $item[$name]['edit'] = [ - 'href' => $this->urlBuilder->getUrl(self::CMS_URL_PATH_EDIT, ['page_id' => $item['page_id']]), + 'href' => $this->urlBuilder->getUrl($this->url, ['page_id' => $item['page_id']]), 'label' => __('Edit') ]; $item[$name]['delete'] = [ -- GitLab From dc88c3403d0982dc0a1d2040263ecce24e970798 Mon Sep 17 00:00:00 2001 From: Leonid Poluyanov <lpoluyanov@ebay.com> Date: Mon, 15 Jun 2015 13:47:04 +0300 Subject: [PATCH 159/396] MAGETWO-37246: Price Permissions not apply for configurable variations --- .../product/edit/super/attribute-js-template.phtml | 4 ++-- .../catalog/product/edit/super/attribute-template.phtml | 9 ++------- 2 files changed, 4 insertions(+), 9 deletions(-) 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 b96279b1731..a997ad89345 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" <?php if(!$block->getCanEditPrice()) {echo 'disabled="disabled"';}?> + <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":{}}' <?php if(!$block->getCanEditPrice()) {echo 'disabled="disabled"';}?>> + <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 3e20649e408..dd8a327146c 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,22 +118,17 @@ $id = $block->escapeHtml($attribute['attribute_id']); <div class="fields-group-2"> <div class="field field-pricing-value"> <div class="control"> - <input type="text" <?php if(!$block->getCanEditPrice()) {echo 'disabled="disabled"';}?> 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); ?>"> - <?php if(!$block->getCanEditPrice()) { - $escapedPricingValue = $block->escapeHtml($pricingValue); - $valueName = $namePrefix . "[$valueIndex][pricing_value]"; - echo "<input type='hidden' class='pricing-value validate-number' name='$valueName' value='$escapedPricingValue'>"; - }?> </div> </div> <div class="field field-pricing-measure"> <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" <?php if(!$block->getCanEditPrice()) {echo 'disabled="disabled"';}?> 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":{}}'> -- GitLab From b0a533d96c1d6f3c7722632c381c44aa53cc8812 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Mon, 15 Jun 2015 14:00:58 +0300 Subject: [PATCH 160/396] MAGNSWTCH-139: PR stabilization - phpdocs fixes --- .../Catalog/Model/Resource/Product/Indexer/Eav/Source.php | 3 ++- app/code/Magento/Eav/Model/Attribute/FrontendType.php | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) 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 c2856a641f8..caa03585913 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 @@ -33,7 +33,8 @@ class Source extends AbstractEav * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper - * @param string|null $resourcePrefix + * @param \Magento\Eav\Model\Attribute\FrontendType $frontendType + * @param null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, diff --git a/app/code/Magento/Eav/Model/Attribute/FrontendType.php b/app/code/Magento/Eav/Model/Attribute/FrontendType.php index 0decac13cf9..798f19e6e16 100644 --- a/app/code/Magento/Eav/Model/Attribute/FrontendType.php +++ b/app/code/Magento/Eav/Model/Attribute/FrontendType.php @@ -11,8 +11,14 @@ namespace Magento\Eav\Model\Attribute; */ class FrontendType { + /** + * @var array + */ private $config; + /** + * @param array $config + */ public function __construct($config = []) { $this->config = $config; @@ -21,7 +27,7 @@ class FrontendType /** * Return list of input types by frontend type * - * @param $inputType + * @param string $inputType * @return string */ public function getType($inputType) -- GitLab From 29a3e064b8c1adca80888769d1916a9ab4739b9d Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Mon, 15 Jun 2015 14:07:49 +0300 Subject: [PATCH 161/396] MAGETWO-38625: Fixing bugs --- .../Product/Indexer/Eav/AbstractEav.php | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) 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 6426b3881d6..78e3339c07a 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 @@ -94,12 +94,19 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index $this->_prepareRelationIndex($processIds); $this->_removeNotVisibleEntityFromIndex(); - // remove old index - $where = $adapter->quoteInto('entity_id IN(?)', $processIds); - $adapter->delete($this->getMainTable(), $where); + $adapter->beginTransaction(); + try { + // remove old index + $where = $adapter->quoteInto('entity_id IN(?)', $processIds); + $adapter->delete($this->getMainTable(), $where); - // insert new index - $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); + // insert new index + $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); + $adapter->commit(); + } catch (\Exception $e) { + $adapter->rollBack(); + throw $e; + } return $this; } @@ -259,10 +266,15 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index protected function _removeAttributeIndexData($attributeId) { $adapter = $this->_getWriteAdapter(); - - $where = $adapter->quoteInto('attribute_id = ?', $attributeId); - $adapter->delete($this->getMainTable(), $where); - + $adapter->beginTransaction(); + try { + $where = $adapter->quoteInto('attribute_id = ?', $attributeId); + $adapter->delete($this->getMainTable(), $where); + $adapter->commit(); + } catch (\Exception $e) { + $adapter->rollBack(); + throw $e; + } return $this; } @@ -276,14 +288,19 @@ abstract class AbstractEav extends \Magento\Catalog\Model\Resource\Product\Index protected function _synchronizeAttributeIndexData($attributeId) { $adapter = $this->_getWriteAdapter(); + $adapter->beginTransaction(); + try { + // remove index by attribute + $where = $adapter->quoteInto('attribute_id = ?', $attributeId); + $adapter->delete($this->getMainTable(), $where); - // remove index by attribute - $where = $adapter->quoteInto('attribute_id = ?', $attributeId); - $adapter->delete($this->getMainTable(), $where); - - // insert new index - $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); - + // insert new index + $this->insertFromTable($this->getIdxTable(), $this->getMainTable()); + $adapter->commit(); + } catch (\Exception $e) { + $adapter->rollBack(); + throw $e; + } return $this; } } -- GitLab From 528a394b21ab483ae8d14cb9b38555e0e847eeb3 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Mon, 15 Jun 2015 14:15:20 +0300 Subject: [PATCH 162/396] MAGNSWTCH-139: composer.lock updated --- composer.lock | 627 +++++++++++++++++++++++++++++--------------------- 1 file changed, 360 insertions(+), 267 deletions(-) diff --git a/composer.lock b/composer.lock index cabae2f7f08..89bae8e9e25 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "1d4847958d7943ffae419e92ebd75c11", + "hash": "aafa184489a3748b29fb8dfff12437cc", "packages": [ { "name": "composer/composer", @@ -76,20 +76,20 @@ }, { "name": "justinrainbow/json-schema", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3" + "reference": "7dfe4f1db8a62be3dd35710efce663537d515653" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2465fe486c864e30badaa4d005ebdf89dbc503f3", - "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/7dfe4f1db8a62be3dd35710efce663537d515653", + "reference": "7dfe4f1db8a62be3dd35710efce663537d515653", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.3.2" }, "require-dev": { "json-schema/json-schema-test-suite": "1.1.0", @@ -138,7 +138,7 @@ "json", "schema" ], - "time": "2015-03-27 16:41:39" + "time": "2015-06-14 20:01:28" }, { "name": "magento/magento-composer-installer", @@ -261,7 +261,7 @@ "ZF1", "framework" ], - "time": "2015-02-06 17:25:45" + "time": "2015-06-02 08:04:41" }, { "name": "monolog/monolog", @@ -480,16 +480,16 @@ }, { "name": "symfony/console", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399" + "reference": "564398bc1f33faf92fc2ec86859983d30eb81806" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/7f0bec04961c61c961df0cb8c2ae88dbfd83f399", - "reference": "7f0bec04961c61c961df0cb8c2ae88dbfd83f399", + "url": "https://api.github.com/repos/symfony/Console/zipball/564398bc1f33faf92fc2ec86859983d30eb81806", + "reference": "564398bc1f33faf92fc2ec86859983d30eb81806", "shasum": "" }, "require": { @@ -533,20 +533,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-05-29 16:22:24" + "time": "2015-06-10 15:30:22" }, { "name": "symfony/finder", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Finder.git", - "reference": "ccb8ed8339cf24824f2ef35dacec30d92ff44368" + "reference": "c13a40d638aeede1e8400f8c956c7f9246c05f75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/ccb8ed8339cf24824f2ef35dacec30d92ff44368", - "reference": "ccb8ed8339cf24824f2ef35dacec30d92ff44368", + "url": "https://api.github.com/repos/symfony/Finder/zipball/c13a40d638aeede1e8400f8c956c7f9246c05f75", + "reference": "c13a40d638aeede1e8400f8c956c7f9246c05f75", "shasum": "" }, "require": { @@ -582,20 +582,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2015-05-15 14:02:48" + "time": "2015-06-04 20:11:48" }, { "name": "symfony/process", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Process.git", - "reference": "e0a82b58e36afc60f8e79b8bc85a22bb064077c1" + "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/e0a82b58e36afc60f8e79b8bc85a22bb064077c1", - "reference": "e0a82b58e36afc60f8e79b8bc85a22bb064077c1", + "url": "https://api.github.com/repos/symfony/Process/zipball/552d8efdc80980cbcca50b28d626ac8e36e3cdd1", + "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1", "shasum": "" }, "require": { @@ -631,7 +631,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:33:16" + "time": "2015-06-08 09:37:21" }, { "name": "tubalmartin/cssmin", @@ -682,13 +682,13 @@ "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendCode.git", - "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3" + "url": "https://github.com/zendframework/zend-code.git", + "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendCode/zipball/cfd5951ff4348e4430850560416c7ddb755f95d3", - "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3", + "url": "https://api.github.com/repos/zendframework/zend-code/zipball/0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", + "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", "shasum": "" }, "require": { @@ -697,6 +697,9 @@ }, "require-dev": { "doctrine/common": ">=2.1", + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-stdlib": "self.version" }, "suggest": { @@ -712,7 +715,7 @@ }, "autoload": { "psr-4": { - "Zend\\Code\\": "" + "Zend\\Code\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -720,25 +723,25 @@ "BSD-3-Clause" ], "description": "provides facilities to generate arbitrary code using an object oriented interface", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-code", "keywords": [ "code", "zf2" ], - "time": "2015-04-01 17:59:08" + "time": "2015-03-31 15:39:14" }, { "name": "zendframework/zend-config", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendConfig.git", - "reference": "8682fe4e2923b383bb6472fc84b5796a07589163" + "url": "https://github.com/zendframework/zend-config.git", + "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendConfig/zipball/8682fe4e2923b383bb6472fc84b5796a07589163", - "reference": "8682fe4e2923b383bb6472fc84b5796a07589163", + "url": "https://api.github.com/repos/zendframework/zend-config/zipball/95f3a4b3fa85d49e6f060183122de4596fa6d29d", + "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d", "shasum": "" }, "require": { @@ -746,6 +749,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", "zendframework/zend-json": "self.version", @@ -766,7 +772,7 @@ }, "autoload": { "psr-4": { - "Zend\\Config\\": "" + "Zend\\Config\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -774,31 +780,36 @@ "BSD-3-Clause" ], "description": "provides a nested object property based user interface for accessing this configuration data within application code", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-config", "keywords": [ "config", "zf2" ], - "time": "2015-04-01 17:59:31" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-console", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendConsole.git", - "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca" + "url": "https://github.com/zendframework/zend-console.git", + "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendConsole/zipball/94ab6663b07e19f20b3319ecf317bd72b6a72dca", - "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca", + "url": "https://api.github.com/repos/zendframework/zend-console/zipball/54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", + "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "suggest": { "zendframework/zend-filter": "To support DefaultRouteMatcher usage", "zendframework/zend-validator": "To support DefaultRouteMatcher usage" @@ -812,32 +823,32 @@ }, "autoload": { "psr-4": { - "Zend\\Console\\": "" + "Zend\\Console\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-console", "keywords": [ "console", "zf2" ], - "time": "2015-04-01 17:59:48" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-di", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendDi.git", - "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190" + "url": "https://github.com/zendframework/zend-di.git", + "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendDi/zipball/0811f2a67ad0b50dfb8d602ed67cde0b82249190", - "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190", + "url": "https://api.github.com/repos/zendframework/zend-di/zipball/b9f8de081adecf71a003a569e9ba76c0a4c00bf2", + "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2", "shasum": "" }, "require": { @@ -846,6 +857,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -860,37 +874,42 @@ }, "autoload": { "psr-4": { - "Zend\\Di\\": "" + "Zend\\Di\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-di", "keywords": [ "di", "zf2" ], - "time": "2015-04-01 18:01:30" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-escaper", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendEscaper.git", - "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96" + "url": "https://github.com/zendframework/zend-escaper.git", + "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendEscaper/zipball/65b3328627362b0be1d5e9067bc846511d1fbc96", - "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96", + "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/15e5769e4fcdb4bf07ebd76500810e7070e23a97", + "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97", "shasum": "" }, "require": { "php": ">=5.3.23" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "type": "library", "extra": { "branch-alias": { @@ -900,38 +919,43 @@ }, "autoload": { "psr-4": { - "Zend\\Escaper\\": "" + "Zend\\Escaper\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-escaper", "keywords": [ "escaper", "zf2" ], - "time": "2015-04-01 18:02:07" + "time": "2015-03-23 18:29:14" }, { "name": "zendframework/zend-eventmanager", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendEventManager.git", - "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695" + "url": "https://github.com/zendframework/zend-eventmanager.git", + "reference": "58d21c95c7005a527262fd536499195f104e83f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendEventManager/zipball/38df5b567d4ff4d22144745c503ba0502d0d5695", - "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695", + "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/58d21c95c7005a527262fd536499195f104e83f9", + "reference": "58d21c95c7005a527262fd536499195f104e83f9", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "type": "library", "extra": { "branch-alias": { @@ -941,32 +965,32 @@ }, "autoload": { "psr-4": { - "Zend\\EventManager\\": "" + "Zend\\EventManager\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-event-manager", "keywords": [ "eventmanager", "zf2" ], - "time": "2015-04-01 18:05:26" + "time": "2015-03-23 18:29:14" }, { "name": "zendframework/zend-filter", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendFilter.git", - "reference": "b13741a88553351fc52472de529b57b580b8f6f1" + "url": "https://github.com/zendframework/zend-filter.git", + "reference": "6d8aed2da81b62a04747346c4370562cdbe34595" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendFilter/zipball/b13741a88553351fc52472de529b57b580b8f6f1", - "reference": "b13741a88553351fc52472de529b57b580b8f6f1", + "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/6d8aed2da81b62a04747346c4370562cdbe34595", + "reference": "6d8aed2da81b62a04747346c4370562cdbe34595", "shasum": "" }, "require": { @@ -974,6 +998,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-crypt": "self.version", "zendframework/zend-servicemanager": "self.version", "zendframework/zend-uri": "self.version" @@ -993,7 +1020,7 @@ }, "autoload": { "psr-4": { - "Zend\\Filter\\": "" + "Zend\\Filter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1001,25 +1028,25 @@ "BSD-3-Clause" ], "description": "provides a set of commonly needed data filters", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-filter", "keywords": [ "filter", "zf2" ], - "time": "2015-04-01 18:09:25" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-form", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendForm.git", - "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3" + "url": "https://github.com/zendframework/zend-form.git", + "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendForm/zipball/09f5bd46ffbf783df22281898e2175b291bd43a3", - "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3", + "url": "https://api.github.com/repos/zendframework/zend-form/zipball/bca0db55718355d25c2c10fdd41a83561f1c94b3", + "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3", "shasum": "" }, "require": { @@ -1028,6 +1055,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-captcha": "self.version", "zendframework/zend-code": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1058,32 +1088,32 @@ }, "autoload": { "psr-4": { - "Zend\\Form\\": "" + "Zend\\Form\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-form", "keywords": [ "form", "zf2" ], - "time": "2015-04-01 18:09:25" + "time": "2015-03-28 20:29:18" }, { "name": "zendframework/zend-http", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendHttp.git", - "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5" + "url": "https://github.com/zendframework/zend-http.git", + "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendHttp/zipball/ee6220609845b32d1b2873c9ac694aef56d508f5", - "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5", + "url": "https://api.github.com/repos/zendframework/zend-http/zipball/9c6047a0bdb3094d3ea07a215ff929cc47de4deb", + "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb", "shasum": "" }, "require": { @@ -1093,6 +1123,11 @@ "zendframework/zend-uri": "self.version", "zendframework/zend-validator": "self.version" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "type": "library", "extra": { "branch-alias": { @@ -1102,7 +1137,7 @@ }, "autoload": { "psr-4": { - "Zend\\Http\\": "" + "Zend\\Http\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1110,25 +1145,25 @@ "BSD-3-Clause" ], "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-http", "keywords": [ "http", "zf2" ], - "time": "2015-04-01 18:09:25" + "time": "2015-03-27 15:46:30" }, { "name": "zendframework/zend-i18n", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendI18n.git", - "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd" + "url": "https://github.com/zendframework/zend-i18n.git", + "reference": "9aebc5287373a802540d75fe5508417f866c2e52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendI18n/zipball/33051775d9a8c341fe3b77d1f3daa0e921e2f4bd", - "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd", + "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/9aebc5287373a802540d75fe5508417f866c2e52", + "reference": "9aebc5287373a802540d75fe5508417f866c2e52", "shasum": "" }, "require": { @@ -1136,6 +1171,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-cache": "self.version", "zendframework/zend-config": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1164,32 +1202,32 @@ }, "autoload": { "psr-4": { - "Zend\\I18n\\": "" + "Zend\\I18n\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-i18n", "keywords": [ "i18n", "zf2" ], - "time": "2015-04-01 18:09:26" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-inputfilter", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendInputFilter.git", - "reference": "16856fec61f285e41e5492235220a4dec06ab90f" + "url": "https://github.com/zendframework/zend-inputfilter.git", + "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendInputFilter/zipball/16856fec61f285e41e5492235220a4dec06ab90f", - "reference": "16856fec61f285e41e5492235220a4dec06ab90f", + "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/4b1398f3635fae3cc5e873c5bb067274f3d10a93", + "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93", "shasum": "" }, "require": { @@ -1199,6 +1237,9 @@ "zendframework/zend-validator": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1213,32 +1254,32 @@ }, "autoload": { "psr-4": { - "Zend\\InputFilter\\": "" + "Zend\\InputFilter\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-input-filter", "keywords": [ "inputfilter", "zf2" ], - "time": "2015-04-01 18:09:26" + "time": "2015-03-23 18:29:14" }, { "name": "zendframework/zend-json", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendJson.git", - "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c" + "url": "https://github.com/zendframework/zend-json.git", + "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendJson/zipball/76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c", - "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c", + "url": "https://api.github.com/repos/zendframework/zend-json/zipball/2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", + "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", "shasum": "" }, "require": { @@ -1246,6 +1287,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version", "zendframework/zend-server": "self.version" }, @@ -1263,7 +1307,7 @@ }, "autoload": { "psr-4": { - "Zend\\Json\\": "" + "Zend\\Json\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1271,30 +1315,35 @@ "BSD-3-Clause" ], "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-json", "keywords": [ "json", "zf2" ], - "time": "2015-04-01 18:09:26" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-loader", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendLoader.git", - "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865" + "url": "https://github.com/zendframework/zend-loader.git", + "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendLoader/zipball/6868b8a0c346f17fb97724c3a63aa2cbf6b94865", - "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865", + "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/65de2c7a56f8eee633c6bf1cfab73e45648880d4", + "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4", "shasum": "" }, "require": { "php": ">=5.3.23" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "type": "library", "extra": { "branch-alias": { @@ -1304,32 +1353,32 @@ }, "autoload": { "psr-4": { - "Zend\\Loader\\": "" + "Zend\\Loader\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-loader", "keywords": [ "loader", "zf2" ], - "time": "2015-04-01 18:09:26" + "time": "2015-03-23 18:29:14" }, { "name": "zendframework/zend-log", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendLog.git", - "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e" + "url": "https://github.com/zendframework/zend-log.git", + "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendLog/zipball/2d5d20fd45470506bdaff727c46dc25fe953146e", - "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e", + "url": "https://api.github.com/repos/zendframework/zend-log/zipball/002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", + "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", "shasum": "" }, "require": { @@ -1338,6 +1387,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-console": "self.version", "zendframework/zend-db": "self.version", "zendframework/zend-escaper": "self.version", @@ -1361,7 +1413,7 @@ }, "autoload": { "psr-4": { - "Zend\\Log\\": "" + "Zend\\Log\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1369,31 +1421,36 @@ "BSD-3-Clause" ], "description": "component for general purpose logging", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-log", "keywords": [ "log", "logging", "zf2" ], - "time": "2015-04-01 18:09:26" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-math", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendMath.git", - "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29" + "url": "https://github.com/zendframework/zend-math.git", + "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendMath/zipball/634123f83ca90b6613f132d0d100e6b5e9890a29", - "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29", + "url": "https://api.github.com/repos/zendframework/zend-math/zipball/f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", + "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", "shasum": "" }, "require": { "php": ">=5.3.23" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "suggest": { "ext-bcmath": "If using the bcmath functionality", "ext-gmp": "If using the gmp functionality", @@ -1409,32 +1466,32 @@ }, "autoload": { "psr-4": { - "Zend\\Math\\": "" + "Zend\\Math\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-math", "keywords": [ "math", "zf2" ], - "time": "2015-04-01 18:09:27" + "time": "2015-03-23 18:29:14" }, { "name": "zendframework/zend-modulemanager", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendModuleManager.git", - "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf" + "url": "https://github.com/zendframework/zend-modulemanager.git", + "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendModuleManager/zipball/cbe16b0eafe734a062ed0182381e64b9c953dccf", - "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf", + "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/af7ae3cd29a1efb73cc66ae1081e606039d5c20f", + "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f", "shasum": "" }, "require": { @@ -1443,6 +1500,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-config": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-loader": "self.version", @@ -1464,32 +1524,32 @@ }, "autoload": { "psr-4": { - "Zend\\ModuleManager\\": "" + "Zend\\ModuleManager\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-module-manager", "keywords": [ "modulemanager", "zf2" ], - "time": "2015-04-01 18:09:27" + "time": "2015-03-23 18:29:14" }, { "name": "zendframework/zend-mvc", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendMvc.git", - "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412" + "url": "https://github.com/zendframework/zend-mvc.git", + "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendMvc/zipball/bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412", - "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412", + "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/0b4a4a829b30be510a3f215c4ff00c703ee8b431", + "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431", "shasum": "" }, "require": { @@ -1500,6 +1560,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-di": "self.version", @@ -1548,32 +1611,32 @@ }, "autoload": { "psr-4": { - "Zend\\Mvc\\": "" + "Zend\\Mvc\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-mvc", "keywords": [ "mvc", "zf2" ], - "time": "2015-04-01 18:09:27" + "time": "2015-03-26 18:55:14" }, { "name": "zendframework/zend-serializer", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendSerializer.git", - "reference": "a46960854d6326f0036d98c9abc7a79e36e25928" + "url": "https://github.com/zendframework/zend-serializer.git", + "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendSerializer/zipball/a46960854d6326f0036d98c9abc7a79e36e25928", - "reference": "a46960854d6326f0036d98c9abc7a79e36e25928", + "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/3c531789a9882a5deb721356a7bd2642b65d4b09", + "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09", "shasum": "" }, "require": { @@ -1583,6 +1646,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1597,7 +1663,7 @@ }, "autoload": { "psr-4": { - "Zend\\Serializer\\": "" + "Zend\\Serializer\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1605,25 +1671,25 @@ "BSD-3-Clause" ], "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-serializer", "keywords": [ "serializer", "zf2" ], - "time": "2015-04-01 18:09:28" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-server", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendServer.git", - "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e" + "url": "https://github.com/zendframework/zend-server.git", + "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendServer/zipball/fc73c34490908ba143af3c57c7e166b40c4b9f8e", - "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e", + "url": "https://api.github.com/repos/zendframework/zend-server/zipball/d11ff0bd529d202022823d4accf5983cbd50fc49", + "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49", "shasum": "" }, "require": { @@ -1631,6 +1697,11 @@ "zendframework/zend-code": "self.version", "zendframework/zend-stdlib": "self.version" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "type": "library", "extra": { "branch-alias": { @@ -1640,38 +1711,41 @@ }, "autoload": { "psr-4": { - "Zend\\Server\\": "" + "Zend\\Server\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-server", "keywords": [ "server", "zf2" ], - "time": "2015-04-01 18:09:28" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-servicemanager", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendServiceManager.git", - "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9" + "url": "https://github.com/zendframework/zend-servicemanager.git", + "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendServiceManager/zipball/d3c27c708a148a30608f313a5b7a61a531bd9cb9", - "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9", + "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/57cf99fa5ac08c05a135a8d0d676c52a5e450083", + "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-di": "self.version" }, "suggest": { @@ -1687,32 +1761,32 @@ }, "autoload": { "psr-4": { - "Zend\\ServiceManager\\": "" + "Zend\\ServiceManager\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-service-manager", "keywords": [ "servicemanager", "zf2" ], - "time": "2015-04-01 18:09:28" + "time": "2015-03-23 18:29:14" }, { "name": "zendframework/zend-soap", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendSoap.git", - "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f" + "url": "https://github.com/zendframework/zend-soap.git", + "reference": "a599463aba97ce247faf3fb443e3c7858b46449b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendSoap/zipball/e42b900798ea95a9063fa4922da976d8b3a8ab6f", - "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f", + "url": "https://api.github.com/repos/zendframework/zend-soap/zipball/a599463aba97ce247faf3fb443e3c7858b46449b", + "reference": "a599463aba97ce247faf3fb443e3c7858b46449b", "shasum": "" }, "require": { @@ -1722,6 +1796,9 @@ "zendframework/zend-uri": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version" }, "suggest": { @@ -1736,38 +1813,41 @@ }, "autoload": { "psr-4": { - "Zend\\Soap\\": "" + "Zend\\Soap\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-soap", "keywords": [ "soap", "zf2" ], - "time": "2015-04-01 18:09:29" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-stdlib", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendStdlib.git", - "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030" + "url": "https://github.com/zendframework/zend-stdlib.git", + "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendStdlib/zipball/eab586f4c18af3fa63c977611939f1f4a3cf1030", - "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030", + "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cf05c5ba75606e47ffee91cedc72778da46f74c3", + "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-eventmanager": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-serializer": "self.version", @@ -1788,32 +1868,32 @@ }, "autoload": { "psr-4": { - "Zend\\Stdlib\\": "" + "Zend\\Stdlib\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-stdlib", "keywords": [ "stdlib", "zf2" ], - "time": "2015-04-01 18:09:29" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-text", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendText.git", - "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2" + "url": "https://github.com/zendframework/zend-text.git", + "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendText/zipball/35f519e20e575a331c2ee554e5a555a59ce4b9e2", - "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2", + "url": "https://api.github.com/repos/zendframework/zend-text/zipball/d962ea25647b20527f3ca34ae225bbc885dabfc7", + "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7", "shasum": "" }, "require": { @@ -1821,6 +1901,11 @@ "zendframework/zend-servicemanager": "self.version", "zendframework/zend-stdlib": "self.version" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "type": "library", "extra": { "branch-alias": { @@ -1830,32 +1915,32 @@ }, "autoload": { "psr-4": { - "Zend\\Text\\": "" + "Zend\\Text\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-text", "keywords": [ "text", "zf2" ], - "time": "2015-04-01 18:09:29" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-uri", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendUri.git", - "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16" + "url": "https://github.com/zendframework/zend-uri.git", + "reference": "bd9e625639415376f6a82551c73328448d7bc7d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendUri/zipball/53f5b162b293f80de8b951eece8e08be83c4fe16", - "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16", + "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/bd9e625639415376f6a82551c73328448d7bc7d1", + "reference": "bd9e625639415376f6a82551c73328448d7bc7d1", "shasum": "" }, "require": { @@ -1863,6 +1948,11 @@ "zendframework/zend-escaper": "self.version", "zendframework/zend-validator": "self.version" }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master" + }, "type": "library", "extra": { "branch-alias": { @@ -1872,7 +1962,7 @@ }, "autoload": { "psr-4": { - "Zend\\Uri\\": "" + "Zend\\Uri\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1880,25 +1970,25 @@ "BSD-3-Clause" ], "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-uri", "keywords": [ "uri", "zf2" ], - "time": "2015-04-01 18:09:29" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-validator", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendValidator.git", - "reference": "eb678d20256f120a72ca27276bbb2875841701ab" + "url": "https://github.com/zendframework/zend-validator.git", + "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendValidator/zipball/eb678d20256f120a72ca27276bbb2875841701ab", - "reference": "eb678d20256f120a72ca27276bbb2875841701ab", + "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/45fac2545a0f2eb66d71cb7966feee481e7c475f", + "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f", "shasum": "" }, "require": { @@ -1906,6 +1996,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-db": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", @@ -1933,7 +2026,7 @@ }, "autoload": { "psr-4": { - "Zend\\Validator\\": "" + "Zend\\Validator\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1941,25 +2034,25 @@ "BSD-3-Clause" ], "description": "provides a set of commonly needed validators", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-validator", "keywords": [ "validator", "zf2" ], - "time": "2015-04-01 18:09:30" + "time": "2015-03-25 20:55:48" }, { "name": "zendframework/zend-view", "version": "2.4.0", "source": { "type": "git", - "url": "https://github.com/zendframework/Component_ZendView.git", - "reference": "e119b4b5f082af58a96eb206e782b62c193227bf" + "url": "https://github.com/zendframework/zend-view.git", + "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/Component_ZendView/zipball/e119b4b5f082af58a96eb206e782b62c193227bf", - "reference": "e119b4b5f082af58a96eb206e782b62c193227bf", + "url": "https://api.github.com/repos/zendframework/zend-view/zipball/37beb1ad46e530f627b4b6c3716efd728e976ba9", + "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9", "shasum": "" }, "require": { @@ -1969,6 +2062,9 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-escaper": "self.version", "zendframework/zend-feed": "self.version", @@ -2007,7 +2103,7 @@ }, "autoload": { "psr-4": { - "Zend\\View\\": "" + "Zend\\View\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2015,27 +2111,27 @@ "BSD-3-Clause" ], "description": "provides a system of helpers, output filters, and variable escaping", - "homepage": "https://github.com/zendframework/zf2", + "homepage": "https://github.com/zendframework/zend-view", "keywords": [ "view", "zf2" ], - "time": "2015-04-01 18:09:30" + "time": "2015-03-25 20:55:48" } ], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.0.4", + "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { @@ -2046,7 +2142,7 @@ "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" + "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { @@ -2055,8 +2151,8 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Instantiator\\": "src" + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2076,20 +2172,20 @@ "constructor", "instantiate" ], - "time": "2014-10-13 12:58:55" + "time": "2015-06-14 21:17:01" }, { "name": "fabpot/php-cs-fixer", - "version": "v1.8.1", + "version": "v1.9", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "c1e28e95a978e967dade5469a4bf88162faa67bf" + "reference": "ef528b9d3f1dd66197baabf8f77c8402c62bb9fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c1e28e95a978e967dade5469a4bf88162faa67bf", - "reference": "c1e28e95a978e967dade5469a4bf88162faa67bf", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/ef528b9d3f1dd66197baabf8f77c8402c62bb9fc", + "reference": "ef528b9d3f1dd66197baabf8f77c8402c62bb9fc", "shasum": "" }, "require": { @@ -2130,7 +2226,7 @@ } ], "description": "A tool to automatically fix PHP code style", - "time": "2015-05-29 06:10:12" + "time": "2015-06-13 09:30:19" }, { "name": "league/climate", @@ -2497,16 +2593,16 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d", + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d", "shasum": "" }, "require": { @@ -2515,13 +2611,10 @@ "type": "library", "autoload": { "classmap": [ - "PHP/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -2537,20 +2630,20 @@ "keywords": [ "timer" ], - "time": "2013-08-02 07:42:54" + "time": "2015-06-13 07:35:30" }, { "name": "phpunit/php-token-stream", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "eab81d02569310739373308137284e0158424330" + "reference": "db63be1159c81df649cd0260e30249a586d4129e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330", - "reference": "eab81d02569310739373308137284e0158424330", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db63be1159c81df649cd0260e30249a586d4129e", + "reference": "db63be1159c81df649cd0260e30249a586d4129e", "shasum": "" }, "require": { @@ -2586,7 +2679,7 @@ "keywords": [ "tokenizer" ], - "time": "2015-04-08 04:46:07" + "time": "2015-06-12 07:34:24" }, { "name": "phpunit/phpunit", @@ -2664,16 +2757,16 @@ }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.3", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7" + "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7", - "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/92408bb1968a81b3217a6fdf6c1a198da83caa35", + "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35", "shasum": "" }, "require": { @@ -2715,7 +2808,7 @@ "mock", "xunit" ], - "time": "2015-05-29 05:19:18" + "time": "2015-06-11 15:55:48" }, { "name": "sebastian/comparator", @@ -3167,16 +3260,16 @@ }, { "name": "symfony/config", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Config.git", - "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4" + "reference": "58ded81f1f582a87c528ef3dae9a859f78b5f374" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Config/zipball/537e9912063e66aa70cbcddd7d6e6e8db61d98e4", - "reference": "537e9912063e66aa70cbcddd7d6e6e8db61d98e4", + "url": "https://api.github.com/repos/symfony/Config/zipball/58ded81f1f582a87c528ef3dae9a859f78b5f374", + "reference": "58ded81f1f582a87c528ef3dae9a859f78b5f374", "shasum": "" }, "require": { @@ -3213,20 +3306,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:33:16" + "time": "2015-06-11 14:06:56" }, { "name": "symfony/dependency-injection", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/DependencyInjection.git", - "reference": "137bf489c5151c7eb1e4b7dd34a123f9a74b966d" + "reference": "1a409e52a38ec891de0a7a61a191d1c62080b69d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/137bf489c5151c7eb1e4b7dd34a123f9a74b966d", - "reference": "137bf489c5151c7eb1e4b7dd34a123f9a74b966d", + "url": "https://api.github.com/repos/symfony/DependencyInjection/zipball/1a409e52a38ec891de0a7a61a191d1c62080b69d", + "reference": "1a409e52a38ec891de0a7a61a191d1c62080b69d", "shasum": "" }, "require": { @@ -3273,20 +3366,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2015-05-29 14:44:44" + "time": "2015-06-11 19:13:11" }, { "name": "symfony/event-dispatcher", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "687039686d0e923429ba6e958d0baa920cd5d458" + "reference": "be3c5ff8d503c46768aeb78ce6333051aa6f26d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/687039686d0e923429ba6e958d0baa920cd5d458", - "reference": "687039686d0e923429ba6e958d0baa920cd5d458", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/be3c5ff8d503c46768aeb78ce6333051aa6f26d9", + "reference": "be3c5ff8d503c46768aeb78ce6333051aa6f26d9", "shasum": "" }, "require": { @@ -3331,20 +3424,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:21:08" + "time": "2015-06-08 09:37:21" }, { "name": "symfony/filesystem", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Filesystem.git", - "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba" + "reference": "a0d43eb3e17d4f4c6990289805a488a0482a07f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Filesystem/zipball/ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", - "reference": "ae4551fd6d4d4f51f2e7390fbc902fbd67f3b7ba", + "url": "https://api.github.com/repos/symfony/Filesystem/zipball/a0d43eb3e17d4f4c6990289805a488a0482a07f3", + "reference": "a0d43eb3e17d4f4c6990289805a488a0482a07f3", "shasum": "" }, "require": { @@ -3380,20 +3473,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2015-05-15 13:33:16" + "time": "2015-06-08 09:37:21" }, { "name": "symfony/stopwatch", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Stopwatch.git", - "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce" + "reference": "c653f1985f6c2b7dbffd04d48b9c0a96aaef814b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/7702945bceddc0e1f744519abb8a2baeb94bd5ce", - "reference": "7702945bceddc0e1f744519abb8a2baeb94bd5ce", + "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/c653f1985f6c2b7dbffd04d48b9c0a96aaef814b", + "reference": "c653f1985f6c2b7dbffd04d48b9c0a96aaef814b", "shasum": "" }, "require": { @@ -3429,20 +3522,20 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:21:08" + "time": "2015-06-04 20:11:48" }, { "name": "symfony/yaml", - "version": "v2.7.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3" + "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3", - "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160", + "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160", "shasum": "" }, "require": { @@ -3478,7 +3571,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-05-02 15:21:08" + "time": "2015-06-10 15:30:22" } ], "aliases": [], -- GitLab From 14d6afd505d5d420d52049083714f9f9f89b7af8 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Mon, 15 Jun 2015 14:15:48 +0300 Subject: [PATCH 163/396] MAGETWO-38625: Fixing bugs --- app/code/Magento/Catalog/Model/Resource/Category/Flat.php | 6 ++++-- .../Model/Resource/Product/Indexer/AbstractIndexer.php | 4 ++-- .../Model/Resource/Product/Indexer/Eav/AbstractEav.php | 6 +++--- .../Catalog/Model/Resource/Product/Indexer/Eav/Source.php | 6 +++--- .../Model/Resource/Product/Indexer/Price/DefaultPrice.php | 6 +++--- .../Model/Resource/Indexer/Stock/DefaultStock.php | 6 +++--- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php index 6cf40cc1427..fcc0fbf435f 100644 --- a/app/code/Magento/Catalog/Model/Resource/Category/Flat.php +++ b/app/code/Magento/Catalog/Model/Resource/Category/Flat.php @@ -79,23 +79,25 @@ 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 * @param \Magento\Catalog\Model\Config $catalogConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager - * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @param string|null $resourcePrefix */ 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, \Magento\Catalog\Model\Config $catalogConfig, \Magento\Framework\Event\ManagerInterface $eventManager, - \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_categoryFactory = $categoryFactory; 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 88165446bb8..03a082ac070 100644 --- a/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php +++ b/app/code/Magento/Catalog/Model/Resource/Product/Indexer/AbstractIndexer.php @@ -23,14 +23,14 @@ abstract class AbstractIndexer extends \Magento\Indexer\Model\Resource\AbstractR * Class constructor * * @param \Magento\Framework\Model\Resource\Db\Context $context - * @param \Magento\Eav\Model\Config $eavConfig * @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\Eav\Model\Config $eavConfig, \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, + \Magento\Eav\Model\Config $eavConfig, $resourcePrefix = null ) { $this->_eavConfig = $eavConfig; 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 78e3339c07a..a156d028292 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,20 +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 \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @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, - \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_eventManager = $eventManager; - parent::__construct($context, $eavConfig, $tableStrategy, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); } /** 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 9b557b82c97..f5899d9a55c 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,22 +25,22 @@ 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 - * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @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, \Magento\Catalog\Model\Resource\Helper $resourceHelper, - \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_resourceHelper = $resourceHelper; - parent::__construct($context, $eavConfig, $eventManager, $tableStrategy, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $eventManager, $resourcePrefix); } /** 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 8bcdb82f8bd..467091e3c42 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 @@ -45,23 +45,23 @@ class DefaultPrice 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\Event\ManagerInterface $eventManager * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @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, \Magento\Framework\Module\Manager $moduleManager, - \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_eventManager = $eventManager; $this->moduleManager = $moduleManager; - parent::__construct($context, $eavConfig, $tableStrategy, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); } /** 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 844cc8b3831..8667d476571 100644 --- a/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php +++ b/app/code/Magento/CatalogInventory/Model/Resource/Indexer/Stock/DefaultStock.php @@ -36,20 +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 \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy * @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, - \Magento\Indexer\Model\Indexer\Table\StrategyInterface $tableStrategy, $resourcePrefix = null ) { $this->_scopeConfig = $scopeConfig; - parent::__construct($context, $eavConfig, $tableStrategy, $resourcePrefix); + parent::__construct($context, $tableStrategy, $eavConfig, $resourcePrefix); } /** -- GitLab From bee869ef4056cae2e7af26ff35aadff97003483b Mon Sep 17 00:00:00 2001 From: Maksym Iakusha <miakusha@ebay.com> Date: Mon, 15 Jun 2015 14:34:52 +0300 Subject: [PATCH 164/396] MAGETWO-38011: [Nord] Unit test Coverage - Sprint 22 --- app/code/Magento/Email/Model/Template.php | 2 +- app/code/Magento/Newsletter/Model/Template.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Email/Model/Template.php b/app/code/Magento/Email/Model/Template.php index 577393b4989..94d95910e12 100644 --- a/app/code/Magento/Email/Model/Template.php +++ b/app/code/Magento/Email/Model/Template.php @@ -190,7 +190,7 @@ 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, $design, $registry, $appEmulation, $storeManager, null, null, $data); } /** diff --git a/app/code/Magento/Newsletter/Model/Template.php b/app/code/Magento/Newsletter/Model/Template.php index 9f2dc723b15..215c5921574 100644 --- a/app/code/Magento/Newsletter/Model/Template.php +++ b/app/code/Magento/Newsletter/Model/Template.php @@ -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, $design, $registry, $appEmulation, $storeManager, null, null, $data); $this->_storeManager = $storeManager; $this->_request = $request; $this->_filter = $filter; -- GitLab From 42dee6905c0cc16c20eb9668278fca7445ca722c Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 14:47:42 +0300 Subject: [PATCH 165/396] MAGETWO-38263: Stabilize story - Make actions column non-draggable --- .../Cms/view/adminhtml/ui_component/cms_block_listing.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml index 6adf2951c32..5be1b7d60b3 100644 --- a/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml +++ b/app/code/Magento/Cms/view/adminhtml/ui_component/cms_block_listing.xml @@ -404,6 +404,7 @@ <column name="actions" class="Magento\Cms\Ui\Component\Listing\Column\BlockActions"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> + <item name="draggable" xsi:type="boolean">false</item> <item name="dataType" xsi:type="string">actions</item> <item name="align" xsi:type="string">left</item> <item name="label" xsi:type="string" translate="true">Action</item> -- GitLab From d44f4b6e5cb661422b42e7e55407747220a39588 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Mon, 15 Jun 2015 15:20:00 +0300 Subject: [PATCH 166/396] MAGETWO-38156: Move gift message to cart --- .../layout/checkout_onepage_index.xml | 42 -------- .../frontend/web/js/model/gift-message_old.js | 59 ------------ .../frontend/web/js/model/gift-options_old.js | 62 ------------ .../view/frontend/web/js/view/gift-options.js | 96 ------------------- .../web/js/view/item-level-gift-message.js | 77 --------------- .../web/js/view/order-level-gift-message.js | 59 ------------ .../frontend/web/template/gift-options.html | 42 -------- .../web/template/item-level-gift-message.html | 76 --------------- .../template/order-level-gift-message.html | 49 ---------- 9 files changed, 562 deletions(-) delete mode 100644 app/code/Magento/GiftMessage/view/frontend/layout/checkout_onepage_index.xml delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message_old.js delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options_old.js delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/view/gift-options.js delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/view/item-level-gift-message.js delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/js/view/order-level-gift-message.js delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/template/item-level-gift-message.html delete mode 100644 app/code/Magento/GiftMessage/view/frontend/web/template/order-level-gift-message.html 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 fbaba91cb60..00000000000 --- 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/web/js/model/gift-message_old.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message_old.js deleted file mode 100644 index d5f0e072c77..00000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-message_old.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define(['underscore', './gift-options'], - function(_, giftOptions) { - "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 { - 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; - } - }; - } -); diff --git a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options_old.js b/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options_old.js deleted file mode 100644 index 000bf4b508e..00000000000 --- a/app/code/Magento/GiftMessage/view/frontend/web/js/model/gift-options_old.js +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -/*global define*/ -define(['underscore'], - 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}); - } - }; - } -); 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 f216daa41a6..00000000000 --- 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 05ef405b1fe..00000000000 --- 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 277f17a2b42..00000000000 --- 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-options.html b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-options.html deleted file mode 100644 index 02b2c1d5f03..00000000000 --- 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 68aedda15ec..00000000000 --- 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 3053c94ed65..00000000000 --- 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> -- GitLab From 98a44d60ffa36bcbed42c43d5ae35c42fe56511a Mon Sep 17 00:00:00 2001 From: Vitaliy Honcharenko <vgoncharenko@ebay.com> Date: Mon, 15 Jun 2015 15:43:53 +0300 Subject: [PATCH 167/396] MTA-2340: Catalog module functional tests maintenance. Category & Product - fixed random fail on bamboo --- .../Super/Config/Attribute/AttributeSelector.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php index 8d3e73f5f5f..4d2bf2cb826 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute/AttributeSelector.php @@ -21,11 +21,16 @@ class AttributeSelector extends SuggestElement */ public function waitResult() { - $this->waitUntil( - function () { - return $this->find($this->searchResult)->isVisible() ? true : null; - } - ); + try { + $this->waitUntil( + function () { + return $this->find($this->searchResult)->isVisible() ? true : null; + } + ); + } catch (\Exception $e) { + // In parallel run on windows change the focus is lost on element + // that causes disappearing of result suggest list. + } } /** -- GitLab From bfaeb675286744133b712816a86ea1bb6bd478d0 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Mon, 15 Jun 2015 16:01:56 +0300 Subject: [PATCH 168/396] MAGETWO-38156: Move gift message to cart --- .../view/frontend/web/js/model/gift-message.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 079f47cb82b..6dc0a0f8f97 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 @@ -22,9 +22,15 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], var message = false; if (this.itemId == 'orderLevel') { - message = window.giftOptionsConfig.giftMessage[this.itemId]; + message = window.giftOptionsConfig.giftMessage.hasOwnProperty(this.itemId) + ? window.giftOptionsConfig.giftMessage[this.itemId] + : null; } else { - message = window.giftOptionsConfig.giftMessage['itemLevel'][this.itemId]; + 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); -- GitLab From 0d55c65b47134b892d3cfae0c1de655cbda8b853 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Mon, 15 Jun 2015 16:12:00 +0300 Subject: [PATCH 169/396] MAGNSWTCH-139: PR stabilization - fix phpdoc --- app/code/Magento/CatalogSearch/Model/Resource/Engine.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php index 134f1006f76..d2b406c61bd 100644 --- a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php +++ b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php @@ -44,12 +44,13 @@ class Engine extends AbstractDb implements EngineInterface /** * Construct - * + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility * @param Advanced $searchResource * @param \Magento\CatalogSearch\Helper\Data $catalogSearchData - * @param string|null $resourcePrefix + * @param \Magento\Eav\Model\Attribute\FrontendType $frontendType + * @param null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, -- GitLab From 3b45713527a3b97105456c472d377fe476e00193 Mon Sep 17 00:00:00 2001 From: Maksym Iakusha <miakusha@ebay.com> Date: Mon, 15 Jun 2015 16:19:07 +0300 Subject: [PATCH 170/396] MAGETWO-38011: [Nord] Unit test Coverage - Sprint 22 --- app/code/Magento/Email/Model/AbstractTemplate.php | 2 ++ app/code/Magento/Newsletter/Model/Queue.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/code/Magento/Email/Model/AbstractTemplate.php b/app/code/Magento/Email/Model/AbstractTemplate.php index 7eda17bd421..fba8e4c5fa9 100644 --- a/app/code/Magento/Email/Model/AbstractTemplate.php +++ b/app/code/Magento/Email/Model/AbstractTemplate.php @@ -71,6 +71,8 @@ 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\Db $resourceCollection * @param array $data */ public function __construct( diff --git a/app/code/Magento/Newsletter/Model/Queue.php b/app/code/Magento/Newsletter/Model/Queue.php index db9308ce4a2..c55b9f1b462 100644 --- a/app/code/Magento/Newsletter/Model/Queue.php +++ b/app/code/Magento/Newsletter/Model/Queue.php @@ -119,6 +119,8 @@ 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\Db $resourceCollection * @param array $data * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ -- GitLab From 3c19786d34b53bdfed8105e915a02609f8a16c39 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Mon, 15 Jun 2015 16:25:43 +0300 Subject: [PATCH 171/396] MAGETWO-38156: Move gift message to cart --- app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index 63337f76af3..15a023a818b 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -71,6 +71,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 -- GitLab From fb65547b9bb1a1b26929df9bd02add673f281e91 Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Mon, 15 Jun 2015 16:48:44 +0300 Subject: [PATCH 172/396] MAGETWO-38161: Create configuration for most popular destinations --- .../Magento/Backend/etc/adminhtml/system.xml | 4 + app/code/Magento/Directory/Block/Data.php | 22 +- .../Directory/Test/Unit/Block/DataTest.php | 326 ++++++++++++++++++ 3 files changed, 347 insertions(+), 5 deletions(-) create mode 100644 app/code/Magento/Directory/Test/Unit/Block/DataTest.php diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml index 614c5a50789..0f30c62e4a5 100644 --- a/app/code/Magento/Backend/etc/adminhtml/system.xml +++ b/app/code/Magento/Backend/etc/adminhtml/system.xml @@ -253,6 +253,10 @@ <label>European Union Countries</label> <source_model>Magento\Directory\Model\Config\Source\Country</source_model> </field> + <field id="destinations" translate="label" type="multiselect" sortOrder="40" showInDefault="1" showInWebsite="0" showInStore="0"> + <label>Top destinations</label> + <source_model>Magento\Directory\Model\Config\Source\Country</source_model> + </field> </group> <group id="locale" translate="label" type="text" sortOrder="8" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Locale Options</label> diff --git a/app/code/Magento/Directory/Block/Data.php b/app/code/Magento/Directory/Block/Data.php index 9df3c512994..08242cb6e25 100644 --- a/app/code/Magento/Directory/Block/Data.php +++ b/app/code/Magento/Directory/Block/Data.php @@ -3,10 +3,6 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - -/** - * Directory data block - */ namespace Magento\Directory\Block; class Data extends \Magento\Framework\View\Element\Template @@ -84,6 +80,20 @@ class Data extends \Magento\Framework\View\Element\Template return $collection; } + /** + * Retrieve list of top destinations countries + * + * @return array + */ + protected function getTopDestinations() + { + $destinations = (string)$this->_scopeConfig->getValue( + 'general/country/destinations', + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); + return !empty($destinations) ? explode(',', $destinations) : []; + } + /** * @param null|string $defValue * @param string $name @@ -102,7 +112,9 @@ class Data extends \Magento\Framework\View\Element\Template if ($cache) { $options = unserialize($cache); } else { - $options = $this->getCountryCollection()->toOptionArray(); + $options = $this->getCountryCollection() + ->setForegroundCountries($this->getTopDestinations()) + ->toOptionArray(); $this->_configCacheType->save(serialize($options), $cacheKey); } $html = $this->getLayout()->createBlock( diff --git a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php new file mode 100644 index 00000000000..20d6cc0fc4a --- /dev/null +++ b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php @@ -0,0 +1,326 @@ +<?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; + +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; + } +} -- GitLab From 58047367fcd52fb5bf1c3b72fadc7d4a5a2f7ec7 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Mon, 15 Jun 2015 17:37:17 +0300 Subject: [PATCH 173/396] MAGETWO-32234: Subcategories in menu are shown instantly when user moves mouse quickly - Added delay config and fix --- lib/web/mage/menu.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 659fb0f915f..0aaf4ae7e45 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -349,8 +349,13 @@ define([ }, 300); } }, - _delay: function(handler, delay) { - this._super(handler, delay); + _delay: function( handler, delay ) { + var instance = this, + handlerProxy = function () { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + }; + return setTimeout( handlerProxy, delay || 0 ); } }); -- GitLab From 5075dc7146526115d8ff3834b2094c96d9236577 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 17:38:56 +0300 Subject: [PATCH 174/396] MAGETWO-38255: Stabilize story after QA --- .../Listing/Column/PageActionsTest.php | 54 ++++++++++++------- .../Component/Listing/Column/PageActions.php | 10 +--- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php b/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php index a3a2fbda293..fdd900b0f7a 100644 --- a/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php +++ b/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php @@ -5,56 +5,72 @@ */ namespace Magento\Cms\Test\Unit\Ui\Component\Listing\Column; +use Magento\Cms\Ui\Component\Listing\Column\PageActions; + class PageActionsTest extends \PHPUnit_Framework_TestCase { public function testPrepareItemsByPageId() { + $pageId = 1; // Create Mocks and SUT $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); /** @var \PHPUnit_Framework_MockObject_MockObject $urlBuilderMock */ $urlBuilderMock = $this->getMockBuilder('Magento\Framework\UrlInterface') ->disableOriginalConstructor() ->getMock(); - $inputUrl = 'href/url/for/edit/action'; /** @var \Magento\Cms\Ui\Component\Listing\Column\PageActions $model */ $model = $objectManager->getObject( 'Magento\Cms\Ui\Component\Listing\Column\PageActions', [ 'urlBuilder' => $urlBuilderMock, - 'url' => $inputUrl ] ); // Define test input and expectations - $items = ['data' => ['items' => [['page_id' => 1]]]]; - $fullUrl = 'full-url-including-base.com/href/url/for/edit/action'; - $name = 'item_name'; - - $editArray = [ - 'href' => $fullUrl, - 'label' => __('Edit'), - 'hidden' => true + $items = [ + 'data' => [ + 'items' => [ + [ + 'page_id' => $pageId + ] + ] + ] ]; + $name = 'item_name'; $expectedItems = [ [ - 'page_id' => 1, - $name => ['edit' => $editArray] + 'page_id' => $pageId, + $name => [ + 'edit' => [ + 'href' => 'test/url/edit', + 'label' => __('Edit'), + ], + 'delete' => [ + 'href' => 'test/url/delete', + 'label' => __('Delete'), + 'confirm' => [ + 'title' => __('Delete "${ $.$data.title }"'), + 'message' => __('Are you sure you wan\'t to delete a "${ $.$data.title }" record?') + ], + ] + ], ] ]; // Configure mocks and object data - $urlBuilderMock->expects($this->once()) + $urlBuilderMock->expects($this->any()) ->method('getUrl') - ->with($inputUrl, ['page_id' => 1]) - ->willReturn($fullUrl); + ->returnValueMap( + [ + PageActions::CMS_URL_PATH_EDIT, ['page_id' => $pageId], 'test/url/edit', + PageActions::CMS_URL_PATH_DELETE, ['page_id' => $pageId], 'test/url/delete', + ] + ); $model->setName($name); $model->prepareDataSource($items); // Run test - $this->assertEquals( - $expectedItems, - $items['data']['items'] - ); + $this->assertEquals($expectedItems, $items['data']['items']); } } diff --git a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php index 33a11731d45..c28a8d4d070 100644 --- a/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php +++ b/app/code/Magento/Cms/Ui/Component/Listing/Column/PageActions.php @@ -26,9 +26,6 @@ class PageActions extends Column /** @var UrlInterface */ protected $urlBuilder; - /** @var string */ - private $url; - /** * @param ContextInterface $context * @param UiComponentFactory $uiComponentFactory @@ -36,7 +33,6 @@ class PageActions extends Column * @param UrlInterface $urlBuilder * @param array $components * @param array $data - * @param string $url */ public function __construct( ContextInterface $context, @@ -44,12 +40,10 @@ class PageActions extends Column UrlBuilder $actionUrlBuilder, UrlInterface $urlBuilder, array $components = [], - array $data = [], - $url = self::CMS_URL_PATH_EDIT + array $data = [] ) { $this->urlBuilder = $urlBuilder; $this->actionUrlBuilder = $actionUrlBuilder; - $this->url = $url; parent::__construct($context, $uiComponentFactory, $components, $data); } @@ -66,7 +60,7 @@ class PageActions extends Column $name = $this->getData('name'); if (isset($item['page_id'])) { $item[$name]['edit'] = [ - 'href' => $this->urlBuilder->getUrl($this->url, ['page_id' => $item['page_id']]), + 'href' => $this->urlBuilder->getUrl(self::CMS_URL_PATH_EDIT, ['page_id' => $item['page_id']]), 'label' => __('Edit') ]; $item[$name]['delete'] = [ -- GitLab From 9bb111858c3cc5331ab3cc9eb017363d665cbb99 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Mon, 15 Jun 2015 17:47:58 +0300 Subject: [PATCH 175/396] MAGETWO-32234: Subcategories in menu are shown instantly when user moves mouse quickly - Added delay config and fix --- lib/web/mage/menu.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 0aaf4ae7e45..9694d7c5f07 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -349,11 +349,11 @@ define([ }, 300); } }, - _delay: function( handler, delay ) { + _delay: function(handler, delay) { var instance = this, handlerProxy = function () { - return ( typeof handler === "string" ? instance[ handler ] : handler ) - .apply( instance, arguments ); + return (typeof handler === "string" ? instance[handler] : handler) + .apply(instance, arguments); }; return setTimeout( handlerProxy, delay || 0 ); } -- GitLab From 0fe3f87db7b0b2db44c08b97951894195126ce92 Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Mon, 15 Jun 2015 18:01:39 +0300 Subject: [PATCH 176/396] MAGETWO-38161: Create configuration for most popular destinations --- app/code/Magento/Directory/Test/Unit/Block/DataTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php index 20d6cc0fc4a..9d5fb0635bd 100644 --- a/app/code/Magento/Directory/Test/Unit/Block/DataTest.php +++ b/app/code/Magento/Directory/Test/Unit/Block/DataTest.php @@ -19,6 +19,9 @@ 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 */ -- GitLab From 3f5ebca99c44ca5c008738a9a75fa3059f1059d8 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 18:02:46 +0300 Subject: [PATCH 177/396] MAGETWO-38255: Stabilize story after QA - Fix functional test --- .../app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php index e2e0547c443..85e3d70f65c 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php @@ -6,8 +6,8 @@ namespace Magento\Cms\Test\Block\Adminhtml\Page; -use Magento\Ui\Test\Block\Adminhtml\DataGrid; use Magento\Mtf\Client\Locator; +use Magento\Ui\Test\Block\Adminhtml\DataGrid; /** * Backend Data Grid for managing "CMS Page" entities. @@ -66,7 +66,7 @@ class Grid extends DataGrid * * @var string */ - protected $previewCmsPage = '.action-menu-item'; + protected $previewCmsPage = ".//a[contains(@class, 'action-menu-item') and text() = '%s']"; /** * Search item and open it on Frontend. @@ -77,10 +77,12 @@ class Grid extends DataGrid */ public function searchAndPreview(array $filter) { + $itemName = 'Preview'; $this->search($filter); $rowItem = $this->_rootElement->find($this->rowItem); if ($rowItem->isVisible()) { - $rowItem->find($this->previewCmsPage)->click(); + $rowItem->find('.action-select')->click(); + $rowItem->find(sprintf($this->previewCmsPage, $itemName), Locator::SELECTOR_XPATH)->click(); $this->waitForElement(); } else { throw new \Exception('Searched item was not found.'); -- GitLab From f86dd863f8e253a5f44f2dcd2768b89f1929db86 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Mon, 15 Jun 2015 18:04:21 +0300 Subject: [PATCH 178/396] MAGETWO-32234: Subcategories in menu are shown instantly when user moves mouse quickly - Added delay config and fix --- lib/web/mage/menu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 9694d7c5f07..20cc49a702b 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -355,7 +355,7 @@ define([ return (typeof handler === "string" ? instance[handler] : handler) .apply(instance, arguments); }; - return setTimeout( handlerProxy, delay || 0 ); + return setTimeout(handlerProxy, delay || 0); } }); -- GitLab From c2a2f84f8c5ac9a60c55f723e1f8f82283afa144 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Mon, 15 Jun 2015 18:04:52 +0300 Subject: [PATCH 179/396] MAGNSWTCH-139: PR stabilization - Applied patch from Magento Architect --- .../Resource/Product/Indexer/Eav/Source.php | 13 +---- .../CatalogSearch/Model/Resource/Engine.php | 16 +----- .../Attribute/Edit/Options/Options.php | 2 +- .../Eav/Model/Attribute/FrontendType.php | 51 ------------------- 4 files changed, 5 insertions(+), 77 deletions(-) delete mode 100644 app/code/Magento/Eav/Model/Attribute/FrontendType.php 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 caa03585913..8ed386a0bac 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 @@ -21,11 +21,6 @@ class Source extends AbstractEav */ protected $_resourceHelper; - /** - * @var \Magento\Eav\Model\Attribute\FrontendType - */ - protected $frontendType; - /** * Construct * @@ -41,11 +36,9 @@ class Source extends AbstractEav \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Catalog\Model\Resource\Helper $resourceHelper, - \Magento\Eav\Model\Attribute\FrontendType $frontendType, $resourcePrefix = null ) { $this->_resourceHelper = $resourceHelper; - $this->frontendType = $frontendType; parent::__construct($context, $eavConfig, $eventManager, $resourcePrefix); } @@ -79,11 +72,9 @@ class Source extends AbstractEav ); if ($multiSelect == true) { - $select->where('ea.backend_type = ?', 'varchar') - ->where('ea.frontend_input in (?)', $this->frontendType->getInputs('multiselect')); + $select->where('ea.backend_type = ?', 'varchar')->where('ea.frontend_input = ?', 'multiselect'); } else { - $select->where('ea.backend_type = ?', 'int') - ->where('ea.frontend_input in (?)', $this->frontendType->getInputs('select')); + $select->where('ea.backend_type = ?', 'int')->where('ea.frontend_input = ?', 'select'); } return $this->_getReadAdapter()->fetchCol($select); diff --git a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php index d2b406c61bd..b72636f830e 100644 --- a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php +++ b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php @@ -30,11 +30,6 @@ class Engine extends AbstractDb implements EngineInterface */ protected $productFactoryNames; - /** - * @var \Magento\Eav\Model\Attribute\FrontendType - */ - protected $frontendType; - /** * Catalog search data * @@ -44,7 +39,7 @@ class Engine extends AbstractDb implements EngineInterface /** * Construct - * + * * @param \Magento\Framework\Model\Resource\Db\Context $context * @param \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility * @param Advanced $searchResource @@ -57,13 +52,11 @@ class Engine extends AbstractDb implements EngineInterface \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility, \Magento\CatalogSearch\Model\Resource\Advanced $searchResource, \Magento\CatalogSearch\Helper\Data $catalogSearchData, - \Magento\Eav\Model\Attribute\FrontendType $frontendType, $resourcePrefix = null ) { $this->_catalogProductVisibility = $catalogProductVisibility; $this->_searchResource = $searchResource; $this->_catalogSearchData = $catalogSearchData; - $this->frontendType = $frontendType; parent::__construct($context, $resourcePrefix); } @@ -156,15 +149,10 @@ class Engine extends AbstractDb implements EngineInterface */ private function isTermFilterableAttribute($attribute) { - $inputTypes = array_merge( - $this->frontendType->getInputs('select'), - $this->frontendType->getInputs('multiselect') - ); - return ($attribute->getIsVisibleInAdvancedSearch() || $attribute->getIsFilterable() || $attribute->getIsFilterableInSearch()) - && in_array($attribute->getFrontendInput(), $inputTypes); + && in_array($attribute->getFrontendInput(), ['select', 'multiselect']); } /** diff --git a/app/code/Magento/Eav/Block/Adminhtml/Attribute/Edit/Options/Options.php b/app/code/Magento/Eav/Block/Adminhtml/Attribute/Edit/Options/Options.php index 13a9b831f2b..d25fdcc5d8b 100644 --- a/app/code/Magento/Eav/Block/Adminhtml/Attribute/Edit/Options/Options.php +++ b/app/code/Magento/Eav/Block/Adminhtml/Attribute/Edit/Options/Options.php @@ -268,7 +268,7 @@ class Options extends \Magento\Backend\Block\Template * * @return \Magento\Eav\Model\Entity\Attribute\AbstractAttribute */ - private function getAttributeObject() + protected function getAttributeObject() { return $this->_registry->registry('entity_attribute'); } diff --git a/app/code/Magento/Eav/Model/Attribute/FrontendType.php b/app/code/Magento/Eav/Model/Attribute/FrontendType.php deleted file mode 100644 index 798f19e6e16..00000000000 --- a/app/code/Magento/Eav/Model/Attribute/FrontendType.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/** - * - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ -namespace Magento\Eav\Model\Attribute; - -/** - * Class FrontendType - */ -class FrontendType -{ - /** - * @var array - */ - private $config; - - /** - * @param array $config - */ - public function __construct($config = []) - { - $this->config = $config; - } - - /** - * Return list of input types by frontend type - * - * @param string $inputType - * @return string - */ - public function getType($inputType) - { - return array_search($inputType, $this->config); - } - - /** - * Return frontend type by input type - * - * @param string $frontendType - * @return string[] - */ - public function getInputs($frontendType) - { - if (isset($this->config[$frontendType]) && is_array($this->config[$frontendType])) { - return array_values($this->config[$frontendType]); - } - return [$frontendType]; - } -} -- GitLab From 2d429d11c273771184c0d2e473a1ed229f3923da Mon Sep 17 00:00:00 2001 From: Vitaliy Honcharenko <vgoncharenko@ebay.com> Date: Mon, 15 Jun 2015 18:20:40 +0300 Subject: [PATCH 180/396] MTA-2340: Catalog module functional tests maintenance. Category & Product - fixed random fail on bamboo --- .../Test/TestCase/CreateCmsPageEntityTest.php | 22 +++++++++--- .../Test/TestCase/CreateCmsPageEntityTest.xml | 36 ++++++++++--------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php index 58c089face0..7c1cddceb98 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.php @@ -9,6 +9,7 @@ namespace Magento\Cms\Test\TestCase; use Magento\Cms\Test\Fixture\CmsPage as CmsPageFixture; use Magento\Cms\Test\Page\Adminhtml\CmsPageIndex; use Magento\Cms\Test\Page\Adminhtml\CmsPageNew; +use Magento\Mtf\Fixture\FixtureFactory; use Magento\Mtf\TestCase\Injectable; /** @@ -45,33 +46,46 @@ class CreateCmsPageEntityTest extends Injectable */ protected $cmsPageNew; + /** + * Fixture factory. + * + * @var FixtureFactory + */ + protected $fixtureFactory; + /** * Inject pages. * * @param CmsPageIndex $cmsIndex * @param CmsPageNew $cmsPageNew + * @param FixtureFactory $fixtureFactory * @return void */ - public function __inject(CmsPageIndex $cmsIndex, CmsPageNew $cmsPageNew) + public function __inject(CmsPageIndex $cmsIndex, CmsPageNew $cmsPageNew, FixtureFactory $fixtureFactory) { $this->cmsIndex = $cmsIndex; $this->cmsPageNew = $cmsPageNew; + $this->fixtureFactory = $fixtureFactory; } /** * Creating Cms page. * - * @param CmsPageFixture $cms - * @return void + * @param array $data + * @param string $fixtureType + * @return array */ - public function test(CmsPageFixture $cms) + public function test(array $data, $fixtureType) { // Steps + $cms = $this->fixtureFactory->createByCode($fixtureType, ['data' => $data]); $this->cmsIndex->open(); $this->cmsIndex->getPageActionsBlock()->addNew(); //TODO: remove cms page new refresh after resolve issue with static js files publication (MAGETWO-37898) $this->cmsPageNew->open(); $this->cmsPageNew->getPageForm()->fill($cms); $this->cmsPageNew->getPageMainActions()->save(); + + return ['cms' => $cms]; } } diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml index c59eaa09795..f421c7ec4a7 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml @@ -9,10 +9,11 @@ <testCase name="Magento\Cms\Test\TestCase\CreateCmsPageEntityTest"> <variation name="CreateCmsPageEntityTestVariation1"> <data name="description" xsi:type="string">MAGETWO-12399: Create CMS Content Page</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/identifier" xsi:type="string">identifier-%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">All Store Views</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="fixtureType" xsi:type="string">cms</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/identifier" xsi:type="string">identifier-%isolation%</data> + <data name="data/store_id" xsi:type="string">All Store Views</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> <data name="tag" xsi:type="string">test_type:acceptance_test</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageInGrid" /> @@ -20,19 +21,21 @@ </variation> <variation name="CreateCmsPageEntityTestVariation2"> <data name="description" xsi:type="string">Create page for default store view</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="fixtureType" xsi:type="string">cms</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageForm" /> </variation> <variation name="CreateCmsPageEntityTestVariation3"> <data name="description" xsi:type="string">Create page with widget and system variable</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> - <data name="cms/data/content/widget/preset" xsi:type="string">default</data> - <data name="cms/data/content/variable" xsi:type="string">General Contact Name</data> + <data name="fixtureType" xsi:type="string">cms</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="data/content/widget/preset" xsi:type="string">default</data> + <data name="data/content/variable" xsi:type="string">General Contact Name</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageForm" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageInGrid" /> @@ -40,10 +43,11 @@ </variation> <variation name="CreateCmsPageEntityTestVariation4"> <data name="description" xsi:type="string">Create disabled page</data> - <data name="cms/data/title" xsi:type="string">NewCmsPage%isolation%</data> - <data name="cms/data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="cms/data/is_active" xsi:type="string">Disabled</data> - <data name="cms/data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> + <data name="fixtureType" xsi:type="string">cms</data> + <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> + <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="data/is_active" xsi:type="string">Disabled</data> + <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageSuccessSaveMessage" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageForm" /> <constraint name="Magento\Cms\Test\Constraint\AssertCmsPageInGrid" /> -- GitLab From 9ab747156c4a35e88576b274ce9caea9a5b72e3e Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Mon, 15 Jun 2015 18:23:26 +0300 Subject: [PATCH 181/396] MAGETWO-32234: Subcategories in menu are shown instantly when user moves mouse quickly - Added delay config and fix --- lib/web/mage/menu.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/web/mage/menu.js b/lib/web/mage/menu.js index 20cc49a702b..c092deb5f0b 100644 --- a/lib/web/mage/menu.js +++ b/lib/web/mage/menu.js @@ -355,6 +355,7 @@ define([ return (typeof handler === "string" ? instance[handler] : handler) .apply(instance, arguments); }; + return setTimeout(handlerProxy, delay || 0); } }); -- GitLab From f9c59b2b8dbd201c20b7c351776309a395959e5c Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 18:36:53 +0300 Subject: [PATCH 182/396] MAGETWO-38263: Stabilize story - Add comments --- .../Ui/view/base/web/js/grid/columns/date.js | 21 +++++++++++++++++-- .../view/base/web/js/grid/columns/select.js | 15 ++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js index be518ae7c3c..90ace7d79af 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/date.js @@ -14,14 +14,31 @@ define([ dateFormat: 'MMM D, YYYY h:mm:ss A' }, + /** + * Initializes components' static properties. + * + * @returns {DateColumn} Chainable. + */ initProperties: function () { this.dateFormat = utils.normalizeDate(this.dateFormat); return this._super(); }, - getLabel: function (data) { - return moment(data).isValid() ? moment(data).format(this.dateFormat) : ''; + /** + * Formats incoming date based on the 'dateFormat' property. + * + * @param {String} date - Date to be formatted. + * @returns {String} Formatted date. + */ + getLabel: function (date) { + date = moment(date); + + date = date.isValid() ? + date.format(this.dateFormat) : + ''; + + return date; } }); }); diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js index 2985ecccc72..46cbff1cf1d 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/select.js @@ -8,16 +8,25 @@ define([ 'use strict'; return Column.extend({ - getLabel: function (data) { + /** + * Retrieves label associated with a provided value. + * + * @param {(String|Number)} value - Value of the option. + * @returns {String} + */ + getLabel: function (value) { var options = this.options || [], label = ''; - data = data || ''; + value = value || ''; + + /*eslint-disable eqeqeq*/ options.some(function (item) { label = item.label; - return item.value == data; + return item.value == value; }); + /*eslint-enable eqeqeq*/ return label; } -- GitLab From 564575bcfd021fe3ca7e064f740d4c725bda877a Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Mon, 15 Jun 2015 19:45:28 +0300 Subject: [PATCH 183/396] MAGETWO-38156: Move gift message to cart --- .../view/frontend/web/js/view/gift-message.js | 21 ++++++++++++++----- .../web/template/gift-message-item-level.html | 11 +++++----- .../frontend/web/template/gift-message.html | 10 +++++---- 3 files changed, 28 insertions(+), 14 deletions(-) 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 index 6ae1c688f41..0fc5cf395d9 100644 --- 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 @@ -8,9 +8,10 @@ define(['uiComponent', '../model/gift-message', '../model/gift-options', '../act "use strict"; return Component.extend({ formBlockVisibility: null, - resultBlockVisibility: false, + resultBlockVisibility: null, model: {}, initialize: function() { + var self = this; this._super() .observe('formBlockVisibility') .observe({'resultBlockVisibility': false}); @@ -19,16 +20,26 @@ define(['uiComponent', '../model/gift-message', '../model/gift-options', '../act var model = new giftMessage(this.itemId); giftOptions.addOption(model); this.model = model; - if (this.model.getObservable('alreadyAdded')()) { - this.resultBlockVisibility(true); - } - var self = this; + 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); 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 index 3fc56dbbc3e..bccd7976fd2 100644 --- 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 @@ -13,7 +13,6 @@ "> <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"> @@ -29,10 +28,12 @@ <!--ko template: appliedTemplate --><!-- /ko --> <!-- /ko --> - <div class="gift-message-summary"> - <span data-bind="text: $t('Message') + ':'"></span> - <!-- ko text: getObservable('message') --><!-- /ko --> - </div> + <!-- ko if: getObservable('message') --> + <div class="gift-message-summary"> + <span style="font-weight: bolder" data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + <!-- /ko --> <div class="actions-toolbar"> <div class="secondary"> 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 index 2ac79801d73..728310153af 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -27,10 +27,12 @@ <!--ko template: appliedTemplate --><!-- /ko --> <!-- /ko --> - <div class="gift-message-summary"> - <span data-bind="text: $t('Message') + ':'"></span> - <!-- ko text: getObservable('message') --><!-- /ko --> - </div> + <!-- ko if: getObservable('message') --> + <div class="gift-message-summary"> + <span style="font-weight: bolder" data-bind="text: $t('Message') + ':'"></span> + <!-- ko text: getObservable('message') --><!-- /ko --> + </div> + <!-- /ko --> <div class="actions-toolbar"> <div class="secondary"> <button type="submit" -- GitLab From 0dc3750d56c792b1f72df62edc57d4cea0226926 Mon Sep 17 00:00:00 2001 From: Leonid Poluyanov <lpoluyanov@ebay.com> Date: Mon, 15 Jun 2015 19:48:37 +0300 Subject: [PATCH 184/396] MAGETWO-37246: Price Permissions not apply for configurable variations - fix tests --- .../Test/Unit/Model/Stock/StockRepositoryTest.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php index da0623ed643..dc13237c467 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockRepositoryTest.php @@ -60,15 +60,18 @@ class StockRepositoryTest extends \PHPUnit_Framework_TestCase $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') -- GitLab From 395ab3e7dbd4acb47aabdd8a74e677a5bc07653d Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Mon, 15 Jun 2015 19:57:37 +0300 Subject: [PATCH 185/396] MTA-2350: Add wait to form element before filling a value --- .../Test/Block/System/Config/Form/Group.php | 2 +- .../Backend/Test/Block/Widget/Form.php | 199 ------------------ .../Backend/Test/Block/Widget/FormTabs.php | 5 +- .../Product/Edit/Action/Attribute.php | 3 +- .../Tab/ProductDetails/NewCategoryIds.php | 2 +- .../Block/Adminhtml/Edit/SearchTermForm.php | 5 +- .../Product/AffectedAttributeSet.php | 2 +- .../Edit/Tab/Super/Config/Attribute.php | 2 +- .../Product/Edit/Tab/Super/Config/Matrix.php | 2 +- .../Test/Block/Adminhtml/Group/Edit/Form.php | 9 +- .../Customer/Test/Repository/Address.xml | 13 ++ .../CreateExistingCustomerFrontendEntity.php | 33 ++- .../CreateExistingCustomerFrontendEntity.xml | 15 +- .../Test/Page/Adminhtml/TemplateEdit.xml | 10 +- .../Test/Page/Adminhtml/TemplateNewIndex.xml | 10 +- .../Test/Page/Adminhtml/TemplateQueue.xml | 10 +- .../Test/Block/Adminhtml/ReviewForm.php | 2 +- .../Order/Create/Billing/Address.xml | 2 +- .../Block/Adminhtml/Order/Create/Coupons.php | 2 +- .../Order/Create/Items/ItemProduct.php | 3 + .../Test/Page/Adminhtml/OrderStatusEdit.xml | 10 +- .../Test/Page/Adminhtml/OrderStatusNew.xml | 10 +- .../Test/TestCase/CreateOrderBackendTest.xml | 14 +- .../Test/Page/Adminhtml/SitemapNew.xml | 8 +- .../Adminhtml/Catalog/Edit/UrlRewriteForm.php | 2 +- .../Test/TestCase/AbstractWishlistTest.php | 6 +- 26 files changed, 95 insertions(+), 286 deletions(-) delete mode 100644 dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Form.php diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php index 0d3244802c7..09123d09767 100644 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/System/Config/Form/Group.php @@ -9,7 +9,7 @@ namespace Magento\Backend\Test\Block\System\Config\Form; use Magento\Mtf\Client\Locator; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; /** * Class Group diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Form.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Form.php deleted file mode 100644 index d57bd1aa4d7..00000000000 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/Form.php +++ /dev/null @@ -1,199 +0,0 @@ -<?php -/** - * @api - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Backend\Test\Block\Widget; - -use Magento\Mtf\Block\Form as FormInstance; -use Magento\Mtf\Client\Locator; -use Magento\Mtf\Factory\Factory; -use Magento\Mtf\Fixture\FixtureInterface; - -/** - * Class Form - * Is used to represent any form on the page - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - */ -class Form extends FormInstance -{ - /** - * 'Save' button - * - * @var string - */ - protected $saveButton = '#save'; - - /** - * 'Save And Continue Edit' button - * - * @var string - */ - protected $saveAndContinueButton = '#save_and_continue'; - - /** - * 'Save And Continue Edit' button - * - * @var string - */ - protected $saveAndContinueEditButton = '#save_and_continue_edit'; - - /** - * Back button - * - * @var string - */ - protected $backButton = '#back'; - - /** - * Reset button - * - * @var string - */ - protected $resetButton = '#reset'; - - /** - * 'Delete' button - * - * @var string - */ - protected $deleteButton = '#delete-button-button'; - - /** - * Backend abstract block - * - * @var string - */ - protected $templateBlock = './ancestor::body'; - - /** - * Selector of element to wait for. If set by child will wait for element after action - * - * @var string - */ - protected $waitForSelector; - - /** - * Locator type of waitForSelector - * - * @var Locator - */ - protected $waitForSelectorType = Locator::SELECTOR_CSS; - - /** - * Wait for should be for visibility or not? - * - * @var boolean - */ - protected $waitForSelectorVisible = true; - - /** - * Update the root form - * - * @param FixtureInterface $fixture - * @return Form - */ - public function update(FixtureInterface $fixture) - { - $this->fill($fixture); - return $this; - } - - /** - * Get backend abstract block - * - * @return \Magento\Backend\Test\Block\Template - */ - protected function getTemplateBlock() - { - return Factory::getBlockFactory()->getMagentoBackendTemplate( - $this->_rootElement->find($this->templateBlock, Locator::SELECTOR_XPATH) - ); - } - - /** - * Save the form - * - * @param FixtureInterface $fixture - * @return Form - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function save(FixtureInterface $fixture = null) - { - $this->_rootElement->find($this->saveButton, Locator::SELECTOR_CSS)->click(); - $this->waitForElement(); - return $this; - } - - /** - * Method that waits for the configured selector using class attributes. - */ - protected function waitForElement() - { - if (!empty($this->waitForSelector)) { - if ($this->waitForSelectorVisible) { - $this->getTemplateBlock()->waitForElementVisible($this->waitForSelector, $this->waitForSelectorType); - } else { - $this->getTemplateBlock()->waitForElementNotVisible($this->waitForSelector, $this->waitForSelectorType); - } - } - } - - /** - * Back action - * - * @return Form - */ - public function back() - { - $this->_rootElement->find($this->backButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Reset the form - * - * @return Form - */ - public function reset() - { - $this->_rootElement->find($this->resetButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Delete current form item - * - * @param FixtureInterface $fixture - * @return Form - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ - public function delete(FixtureInterface $fixture = null) - { - $this->_rootElement->find($this->deleteButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Click save and continue button on form - */ - public function clickSaveAndContinue() - { - $this->_rootElement->find($this->saveAndContinueButton, Locator::SELECTOR_CSS)->click(); - return $this; - } - - /** - * Click save and continue button on form - */ - public function clickSaveAndContinueEdit() - { - $this->_rootElement->find($this->saveAndContinueEditButton, Locator::SELECTOR_CSS)->click(); - return $this; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php index fac7674d268..48899443bbd 100755 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php @@ -7,6 +7,7 @@ namespace Magento\Backend\Test\Block\Widget; use Magento\Mtf\Block\BlockFactory; +use Magento\Mtf\Block\Form; use Magento\Mtf\Block\Mapper; use Magento\Mtf\Client\Locator; use Magento\Mtf\Client\ElementInterface; @@ -99,12 +100,10 @@ class FormTabs extends Form /** * Fill fields which weren't found on filled tabs * - * @param array $tabs * @throws \Exception - * * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ - protected function fillMissedFields(array $tabs) + protected function fillMissedFields() { foreach ($this->tabs as $tabName => $tabData) { $tab = $this->getTab($tabName); diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php index 39e76e2c98e..bd1b633deed 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Action/Attribute.php @@ -7,7 +7,7 @@ namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Action; use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Element\SimpleElement; /** @@ -25,6 +25,7 @@ class Attribute extends Form public function fill(FixtureInterface $fixture, SimpleElement $element = null) { $data = $fixture->getData(); + $fields = []; foreach ($data as $name => $dataValue) { $fields['toggle_' . $name] = 'Yes'; $fields[$name] = $dataValue; diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php index c1baad740ef..5c44c611d8d 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Product/Edit/Tab/ProductDetails/NewCategoryIds.php @@ -7,7 +7,7 @@ namespace Magento\Catalog\Test\Block\Adminhtml\Product\Edit\Tab\ProductDetails; use Magento\Catalog\Test\Fixture\Category; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; /** * Create new category. diff --git a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php index c3c576a8b7d..25ca938dde0 100644 --- a/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php +++ b/dev/tests/functional/tests/app/Magento/CatalogSearch/Test/Block/Adminhtml/Edit/SearchTermForm.php @@ -6,11 +6,10 @@ namespace Magento\CatalogSearch\Test\Block\Adminhtml\Edit; -use Magento\Backend\Test\Block\Widget\Form as WidgetForm; +use Magento\Mtf\Block\Form as WidgetForm; /** - * Class Form - * Form for search term + * Form for search term. */ class SearchTermForm extends WidgetForm { diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php index 1385164d592..c838565a3d1 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/AffectedAttributeSet.php @@ -10,7 +10,7 @@ use Magento\Mtf\Client\Element; use Magento\Mtf\Client\Locator; use Magento\Mtf\Fixture\FixtureInterface; use Magento\Mtf\Client\Element\SimpleElement; -use Magento\Backend\Test\Block\Widget\Form as ParentForm; +use Magento\Mtf\Block\Form as ParentForm; /** * Class AffectedAttributeSet diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php index 9008800f6dd..23714ad9437 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php @@ -6,7 +6,7 @@ namespace Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config\Attribute\AttributeSelector; use Magento\Mtf\Client\Element\SimpleElement; use Magento\Mtf\Client\Locator; diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php index 11db5ed3046..8ecdc5aa867 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Matrix.php @@ -8,7 +8,7 @@ namespace Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Supe use Magento\Mtf\Client\Locator; use Magento\Backend\Test\Block\Template; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Element\SimpleElement; /** diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php index b262872d048..e840b736e06 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Block/Adminhtml/Group/Edit/Form.php @@ -6,15 +6,10 @@ namespace Magento\Customer\Test\Block\Adminhtml\Group\Edit; -use Magento\Backend\Test\Block\Widget\Form as AbstractForm; - /** - * Class Form - * Customer group edit form - * - * @package Magento\Customer\Test\Block\Adminhtml\Group\Edit + * Customer group edit form. */ -class Form extends AbstractForm +class Form extends \Magento\Mtf\Block\Form { // } diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml index a3156dbf6ec..b39490b24c4 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/Repository/Address.xml @@ -165,6 +165,19 @@ <field name="fax" xsi:type="string">444-44-444-44</field> </dataset> + <dataset name="UK_address_without_email"> + <field name="firstname" xsi:type="string">Jane</field> + <field name="lastname" xsi:type="string">Doe</field> + <field name="company" xsi:type="string">Magento %isolation%</field> + <field name="city" xsi:type="string">London</field> + <field name="street" xsi:type="string">172, Westminster Bridge Rd</field> + <field name="postcode" xsi:type="string">SE1 7RW</field> + <field name="country_id" xsi:type="string">United Kingdom</field> + <field name="region" xsi:type="string">London</field> + <field name="telephone" xsi:type="string">444-44-444-44</field> + <field name="fax" xsi:type="string">444-44-444-44</field> + </dataset> + <dataset name="UK_address_with_VAT"> <field name="firstname" xsi:type="string">Jane</field> <field name="lastname" xsi:type="string">Doe</field> 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 a1e5265c36c..010ed24047c 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.php @@ -13,11 +13,9 @@ use Magento\Customer\Test\Page\CustomerAccountLogout; use Magento\Mtf\TestCase\Injectable; /** - * Test Creation for CreateExistingCustomerFrontendEntity - * - * Test Flow: * Preconditions: - * 1.Customer is created + * 1.Customer is created. + * * Steps: * 1. Go to frontend. * 2. Click Register link. @@ -36,14 +34,14 @@ class CreateExistingCustomerFrontendEntity extends Injectable /* end tags */ /** - * Page CustomerAccountCreate + * Page CustomerAccountCreate. * * @var CustomerAccountCreate */ protected $customerAccountCreate; /** - * Page CustomerAccountLogout + * Page CustomerAccountLogout. * * @var CustomerAccountLogout */ @@ -57,46 +55,43 @@ class CreateExistingCustomerFrontendEntity extends Injectable protected $cmsIndex; /** - * Injection data + * Inject pages. * * @param CustomerAccountCreate $customerAccountCreate * @param CustomerAccountLogout $customerAccountLogout * @param CmsIndex $cmsIndex - * @param Customer $customer * @return array */ public function __inject( CustomerAccountCreate $customerAccountCreate, CustomerAccountLogout $customerAccountLogout, - CmsIndex $cmsIndex, - Customer $customer + CmsIndex $cmsIndex ) { $this->customerAccountLogout = $customerAccountLogout; $this->customerAccountCreate = $customerAccountCreate; $this->cmsIndex = $cmsIndex; - //Precondition - $customer->persist(); - return [ - 'customer' => $customer, - ]; } /** - * Create Existing Customer account on frontend + * Create Existing Customer account on frontend. * * @param Customer $customer * @return void */ public function testCreateExistingCustomer(Customer $customer) { - //Steps + // Precondition + $existingCustomer = clone $customer; + $customer->persist(); + + // Steps $this->cmsIndex->open(); $this->cmsIndex->getLinksBlock()->openLink('Register'); - $this->customerAccountCreate->getRegisterForm()->registerCustomer($customer); + $this->customerAccountCreate->getRegisterForm()->registerCustomer($existingCustomer); } /** - * Logout customer from frontend account + * Logout customer from frontend account. * * @return void */ diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml index 7c8b8ff68e4..3fbdcf50f62 100644 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml +++ b/dev/tests/functional/tests/app/Magento/Customer/Test/TestCase/CreateExistingCustomerFrontendEntity.xml @@ -6,9 +6,14 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Customer\Test\TestCase\CreateExistingCustomerFrontendEntity"> - <variation name="CreateExistingCustomerFrontendEntityVariation1"> - <constraint name="Magento\Customer\Test\Constraint\AssertCustomerFailRegisterMessage"/> - </variation> - </testCase> + <testCase name="Magento\Customer\Test\TestCase\CreateExistingCustomerFrontendEntity"> + <variation name="CreateExistingCustomerFrontendEntityVariation1"> + <data name="customer/data/firstname" xsi:type="string">john</data> + <data name="customer/data/lastname" xsi:type="string">doe</data> + <data name="customer/data/email" xsi:type="string">johndoe%isolation%@example.com</data> + <data name="customer/data/password" xsi:type="string">123123q</data> + <data name="customer/data/password_confirmation" xsi:type="string">123123q</data> + <constraint name="Magento\Customer\Test\Constraint\AssertCustomerFailRegisterMessage" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml index c17dbfb6ada..56ee9f7302d 100644 --- a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml +++ b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateEdit.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="TemplateEdit" area="Adminhtml" mca="newsletter/template/edit" module="Magento_Newsletter"> - <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="editForm" class="Magento\Backend\Test\Block\Widget\Form" locator="[id='page:main-container']" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="TemplateEdit" area="Adminhtml" mca="newsletter/template/edit" module="Magento_Newsletter"> + <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="editForm" class="Magento\Mtf\Block\Form" locator="[id='page:main-container']" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml index 968920909e5..b2744b0902e 100644 --- a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml +++ b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateNewIndex.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="TemplateNewIndex" area="Adminhtml" mca="newsletter/template/new/index" module="Magento_Newsletter"> - <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="editForm" class="Magento\Backend\Test\Block\Widget\Form" locator="[id='page:main-container']" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="TemplateNewIndex" area="Adminhtml" mca="newsletter/template/new/index" module="Magento_Newsletter"> + <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="editForm" class="Magento\Mtf\Block\Form" locator="[id='page:main-container']" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml index 8e17bfc6814..c4840bceae2 100644 --- a/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml +++ b/dev/tests/functional/tests/app/Magento/Newsletter/Test/Page/Adminhtml/TemplateQueue.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="TemplateQueue" area="Adminhtml" mca="newsletter/queue/edit" module="Magento_Newsletter"> - <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="editForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#queue_edit_form" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="TemplateQueue" area="Adminhtml" mca="newsletter/queue/edit" module="Magento_Newsletter"> + <block name="formPageActions" class="Magento\Newsletter\Test\Block\Adminhtml\Template\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="editForm" class="Magento\Mtf\Block\Form" locator="#queue_edit_form" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php index a9499d608da..90c86209338 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php @@ -6,7 +6,7 @@ namespace Magento\Review\Test\Block\Adminhtml; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; /** diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml index 424602ae08d..2439e6aeac7 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Billing/Address.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="1"> +<mapping strict="0"> <wrapper>order[billing_address]</wrapper> <fields> <firstname /> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php index 0a350725839..14ec5f4336b 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Coupons.php @@ -6,7 +6,7 @@ namespace Magento\Sales\Test\Block\Adminhtml\Order\Create; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\SalesRule\Test\Fixture\SalesRule; use Magento\Mtf\Client\Locator; diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php index 77060264e1d..efcf05d2a42 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Block/Adminhtml/Order/Create/Items/ItemProduct.php @@ -91,6 +91,9 @@ class ItemProduct extends Form if (isset($data['cartItem'])) { unset($data['cartItem']); } + if (isset($data['options'])) { + unset($data['options']); + } $mapping = $this->dataMapping($data); $this->_fill($mapping, $element); diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml index c1d712de6a2..298289698a1 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusEdit.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="OrderStatusEdit" area="Adminhtml" mca="sales/order_status/edit" module="Magento_Sales"> - <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="orderStatusForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#edit_form" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="OrderStatusEdit" area="Adminhtml" mca="sales/order_status/edit" module="Magento_Sales"> + <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="orderStatusForm" class="Magento\Mtf\Block\Form" locator="#edit_form" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml index 856880560d3..0457f3a4b18 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/Page/Adminhtml/OrderStatusNew.xml @@ -6,9 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="OrderStatusNew" area="Adminhtml" mca="sales/order_status/new" module="Magento_Sales"> - <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector"/> - <block name="orderStatusForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#edit_form" strategy="css selector"/> - <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector"/> - </page> + <page name="OrderStatusNew" area="Adminhtml" mca="sales/order_status/new" module="Magento_Sales"> + <block name="formPageActions" class="Magento\Backend\Test\Block\FormPageActions" locator=".page-main-actions" strategy="css selector" /> + <block name="orderStatusForm" class="Magento\Mtf\Block\Form" locator="#edit_form" strategy="css selector" /> + <block name="messagesBlock" class="Magento\Backend\Test\Block\Messages" locator="#messages" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml index 5359e6a9513..ce5a4f0d956 100644 --- a/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml +++ b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CreateOrderBackendTest.xml @@ -11,7 +11,7 @@ <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Cash on Delivery payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> <data name="customer/dataSet" xsi:type="string">default</data> - <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="saveAddress" xsi:type="string">No</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -32,7 +32,7 @@ <data name="description" xsi:type="string">Create order with virtual product for registered UK customer using Check/Money Order payment method</data> <data name="products" xsi:type="string">catalogProductVirtual::default</data> <data name="customer/dataSet" xsi:type="string">default</data> - <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address_without_email</data> <data name="prices" xsi:type="array"> <item name="grandTotal" xsi:type="string">10.00</item> </data> @@ -50,7 +50,7 @@ <data name="description" xsi:type="string">Create order with simple product for registered US customer using Fixed shipping method and Bank Transfer payment method</data> <data name="products" xsi:type="string">catalogProductSimple::default</data> <data name="customer/dataSet" xsi:type="string">default</data> - <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="saveAddress" xsi:type="string">No</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> @@ -72,7 +72,7 @@ <data name="description" xsi:type="string">Create order with virtual product for registered UK customer using Bank Transfer payment method</data> <data name="products" xsi:type="string">catalogProductVirtual::default</data> <data name="customer/dataSet" xsi:type="string">default</data> - <data name="billingAddress/dataSet" xsi:type="string">UK_address</data> + <data name="billingAddress/dataSet" xsi:type="string">UK_address_without_email</data> <data name="saveAddress" xsi:type="string">No</data> <data name="prices" xsi:type="array"> <item name="grandTotal" xsi:type="string">10.00</item> @@ -93,7 +93,7 @@ <data name="products" xsi:type="string">catalogProductSimple::default</data> <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">No</data> - <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> @@ -117,7 +117,7 @@ <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">No</data> <data name="checkoutMethod" xsi:type="string">login</data> - <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> @@ -135,7 +135,7 @@ <data name="customer/dataSet" xsi:type="string">default</data> <data name="saveAddress" xsi:type="string">Yes</data> <data name="checkoutMethod" xsi:type="string">register</data> - <data name="billingAddress/dataSet" xsi:type="string">US_address_1</data> + <data name="billingAddress/dataSet" xsi:type="string">US_address_1_without_email</data> <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> <data name="shipping/shipping_method" xsi:type="string">Fixed</data> <data name="prices" xsi:type="array"> diff --git a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml index 4f33714bfae..68528664082 100644 --- a/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml +++ b/dev/tests/functional/tests/app/Magento/Sitemap/Test/Page/Adminhtml/SitemapNew.xml @@ -6,8 +6,8 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/mtf/etc/pages.xsd"> - <page name="SitemapNew" area="Adminhtml" mca="sitemap/new/index" module="Magento_Sitemap"> - <block name="sitemapForm" class="Magento\Backend\Test\Block\Widget\Form" locator="#add_sitemap_form" strategy="css selector"/> - <block name="sitemapPageActions" class="Magento\Sitemap\Test\Block\Adminhtml\SitemapPageActions" locator=".page-main-actions" strategy="css selector"/> - </page> + <page name="SitemapNew" area="Adminhtml" mca="sitemap/new/index" module="Magento_Sitemap"> + <block name="sitemapForm" class="Magento\Mtf\Block\Form" locator="#add_sitemap_form" strategy="css selector" /> + <block name="sitemapPageActions" class="Magento\Sitemap\Test\Block\Adminhtml\SitemapPageActions" locator=".page-main-actions" strategy="css selector" /> + </page> </config> diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php index 373c6c4cabd..c03527b655a 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php @@ -6,7 +6,7 @@ namespace Magento\UrlRewrite\Test\Block\Adminhtml\Catalog\Edit; -use Magento\Backend\Test\Block\Widget\Form; +use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Element\SimpleElement; use Magento\Mtf\Client\Element; use Magento\Mtf\Fixture\FixtureInterface; diff --git a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php index 736d2e0e813..b3102c9d7f9 100644 --- a/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php +++ b/dev/tests/functional/tests/app/Magento/Wishlist/Test/TestCase/AbstractWishlistTest.php @@ -119,11 +119,9 @@ abstract class AbstractWishlistTest extends Injectable */ protected function addToWishlist(array $products, $configure = false) { - $addProductsToWishlistStep = $this->objectManager->create( + $this->objectManager->create( 'Magento\Wishlist\Test\TestStep\AddProductsToWishlistStep', ['products' => $products, 'configure' => $configure] - ); - - $addProductsToWishlistStep->run(); + )->run(); } } -- GitLab From dfcdc20db475f9f051d29cf343bd24b1f63c89c2 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Mon, 15 Jun 2015 20:05:59 +0300 Subject: [PATCH 186/396] MAGETWO-38255: Stabilize story after QA --- .../Listing/Column/PageActionsTest.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php b/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php index fdd900b0f7a..21c1d2ec499 100644 --- a/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php +++ b/app/code/Magento/Cms/Test/Unit/Ui/Component/Listing/Column/PageActionsTest.php @@ -61,10 +61,22 @@ class PageActionsTest extends \PHPUnit_Framework_TestCase // Configure mocks and object data $urlBuilderMock->expects($this->any()) ->method('getUrl') - ->returnValueMap( + ->willReturnMap( [ - PageActions::CMS_URL_PATH_EDIT, ['page_id' => $pageId], 'test/url/edit', - PageActions::CMS_URL_PATH_DELETE, ['page_id' => $pageId], 'test/url/delete', + [ + PageActions::CMS_URL_PATH_EDIT, + [ + 'page_id' => $pageId + ], + 'test/url/edit', + ], + [ + PageActions::CMS_URL_PATH_DELETE, + [ + 'page_id' => $pageId + ], + 'test/url/delete', + ], ] ); -- GitLab From d3137d59d610aa66449ff8b089934e883334dbe2 Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Mon, 15 Jun 2015 22:11:25 +0300 Subject: [PATCH 187/396] MAGETWO-38158: Pre-populate Zip/State/Country and make automatic estimation --- .../Magento/Checkout/Block/Cart/Shipping.php | 75 +++++++++++ .../Api/Data/EstimateAddressInterface.php | 103 +++++++++++++++ .../Api/ShippingMethodManagementInterface.php | 18 +++ .../Magento/Quote/Model/EstimateAddress.php | 119 ++++++++++++++++++ .../Quote/Model/ShippingMethodManagement.php | 87 ++++++++++++- app/code/Magento/Quote/etc/di.xml | 1 + 6 files changed, 402 insertions(+), 1 deletion(-) create mode 100644 app/code/Magento/Quote/Api/Data/EstimateAddressInterface.php create mode 100644 app/code/Magento/Quote/Model/EstimateAddress.php diff --git a/app/code/Magento/Checkout/Block/Cart/Shipping.php b/app/code/Magento/Checkout/Block/Cart/Shipping.php index 8cf93dd33ea..8be6a01e725 100644 --- a/app/code/Magento/Checkout/Block/Cart/Shipping.php +++ b/app/code/Magento/Checkout/Block/Cart/Shipping.php @@ -5,7 +5,12 @@ */ 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; class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart { @@ -43,6 +48,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,6 +80,11 @@ 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 */ public function __construct( @@ -59,11 +94,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 +354,34 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart $block->setShippingRate($shippingRate); return $block->toHtml(); } + + /** + * {@inheritDoc} + */ + protected function _beforeToHtml() + { + if ($customerId = $this->_customerSession->getCustomerId()) { + $customer = $this->customerRepository->getById($customerId); + if ($defaultShipping = $customer->getDefaultShipping()) { + $address = $this->addressRepository->getById($defaultShipping); + if ($address && + ($address->getCountryId() + || $address->getPostcode() + || $address->getRegion() + || $address->getRegionId() + ) + ) { + /** @var \Magento\Quote\Api\Data\EstimateAddressInterface $estimatedAddress */ + $estimatedAddress = $this->estimatedAddressFactory->create(); + $estimatedAddress->setCountryId($address->getCountryId()); + $estimatedAddress->setPostcode($address->getPostcode()); + $estimatedAddress->setRegion($address->getRegion()); + $estimatedAddress->setRegionId($address->getRegionId()); + $this->shippingMethodManager->estimateByAddress($this->getQuote()->getId(), $estimatedAddress); + $this->quoteRepository->save($this->getQuote()); + } + } + } + return parent::_beforeToHtml(); + } } 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 00000000000..5d5eb863518 --- /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 51044998e15..e9edbf4241f 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 00000000000..652f8a00f68 --- /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 c1dc45aee4a..f8a39533b42 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 a9c14a1991f..66cae592e21 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"> -- GitLab From 69ec1735fb008d54afe959f141b0371349691c6c Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Tue, 26 May 2015 13:39:53 +0300 Subject: [PATCH 188/396] MAGNIMEX-183: Import advanced prices - Base module --- .../AdvancedPricingImportExport/LICENSE.txt | 48 +++ .../LICENSE_AFL.txt | 48 +++ .../Model/Import/AdvancedPricing.php | 310 ++++++++++++++++++ .../Import/AdvancedPricing/Validator.php | 49 +++ .../AdvancedPricing/Validator/GroupPrice.php | 115 +++++++ .../AdvancedPricing/Validator/TierPrice.php | 120 +++++++ .../AdvancedPricingImportExport/README.md | 1 + .../AdvancedPricingImportExport/composer.json | 27 ++ .../AdvancedPricingImportExport/etc/di.xml | 17 + .../etc/import.xml | 10 + .../etc/module.xml | 11 + 11 files changed, 756 insertions(+) create mode 100644 app/code/Magento/AdvancedPricingImportExport/LICENSE.txt create mode 100644 app/code/Magento/AdvancedPricingImportExport/LICENSE_AFL.txt create mode 100644 app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/README.md create mode 100644 app/code/Magento/AdvancedPricingImportExport/composer.json create mode 100644 app/code/Magento/AdvancedPricingImportExport/etc/di.xml create mode 100644 app/code/Magento/AdvancedPricingImportExport/etc/import.xml create mode 100644 app/code/Magento/AdvancedPricingImportExport/etc/module.xml diff --git a/app/code/Magento/AdvancedPricingImportExport/LICENSE.txt b/app/code/Magento/AdvancedPricingImportExport/LICENSE.txt new file mode 100644 index 00000000000..2b7359b7dfc --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/LICENSE.txt @@ -0,0 +1,48 @@ + +Open Software License ("OSL") v. 3.0 + +This Open Software License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: + +Licensed under the Open Software License version 3.0 + + 1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + 1. to reproduce the Original Work in copies, either alone or as part of a collective work; + + 2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + + 3. to distribute or communicate copies of the Original Work and Derivative Works to the public, with the proviso that copies of Original Work or Derivative Works that You distribute or communicate shall be licensed under this Open Software License; + + 4. to perform the Original Work publicly; and + + 5. to display the Original Work publicly. + + 2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. + + 3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. + + 4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + + 5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). + + 6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + + 7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. + + 8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. + + 9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including 'fair use' or 'fair dealing'). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). + + 10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + + 11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. + + 12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + + 13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + + 14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + 15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + + 16. Modification of This License. This License is Copyright (C) 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Open Software License" or "OSL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/LICENSE_AFL.txt b/app/code/Magento/AdvancedPricingImportExport/LICENSE_AFL.txt new file mode 100644 index 00000000000..7232b53a673 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/LICENSE_AFL.txt @@ -0,0 +1,48 @@ + +Academic Free License ("AFL") v. 3.0 + +This Academic Free License (the "License") applies to any original work of authorship (the "Original Work") whose owner (the "Licensor") has placed the following licensing notice adjacent to the copyright notice for the Original Work: + +Licensed under the Academic Free License version 3.0 + + 1. Grant of Copyright License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, for the duration of the copyright, to do the following: + + 1. to reproduce the Original Work in copies, either alone or as part of a collective work; + + 2. to translate, adapt, alter, transform, modify, or arrange the Original Work, thereby creating derivative works ("Derivative Works") based upon the Original Work; + + 3. to distribute or communicate copies of the Original Work and Derivative Works to the public, under any license of your choice that does not contradict the terms and conditions, including Licensor's reserved rights and remedies, in this Academic Free License; + + 4. to perform the Original Work publicly; and + + 5. to display the Original Work publicly. + + 2. Grant of Patent License. Licensor grants You a worldwide, royalty-free, non-exclusive, sublicensable license, under patent claims owned or controlled by the Licensor that are embodied in the Original Work as furnished by the Licensor, for the duration of the patents, to make, use, sell, offer for sale, have made, and import the Original Work and Derivative Works. + + 3. Grant of Source Code License. The term "Source Code" means the preferred form of the Original Work for making modifications to it and all available documentation describing how to modify the Original Work. Licensor agrees to provide a machine-readable copy of the Source Code of the Original Work along with each copy of the Original Work that Licensor distributes. Licensor reserves the right to satisfy this obligation by placing a machine-readable copy of the Source Code in an information repository reasonably calculated to permit inexpensive and convenient access by You for as long as Licensor continues to distribute the Original Work. + + 4. Exclusions From License Grant. Neither the names of Licensor, nor the names of any contributors to the Original Work, nor any of their trademarks or service marks, may be used to endorse or promote products derived from this Original Work without express prior permission of the Licensor. Except as expressly stated herein, nothing in this License grants any license to Licensor's trademarks, copyrights, patents, trade secrets or any other intellectual property. No patent license is granted to make, use, sell, offer for sale, have made, or import embodiments of any patent claims other than the licensed claims defined in Section 2. No license is granted to the trademarks of Licensor even if such marks are included in the Original Work. Nothing in this License shall be interpreted to prohibit Licensor from licensing under terms different from this License any Original Work that Licensor otherwise would have a right to license. + + 5. External Deployment. The term "External Deployment" means the use, distribution, or communication of the Original Work or Derivative Works in any way such that the Original Work or Derivative Works may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Work or a Derivative Work as a distribution under section 1(c). + + 6. Attribution Rights. You must retain, in the Source Code of any Derivative Works that You create, all copyright, patent, or trademark notices from the Source Code of the Original Work, as well as any notices of licensing and any descriptive text identified therein as an "Attribution Notice." You must cause the Source Code for any Derivative Works that You create to carry a prominent Attribution Notice reasonably calculated to inform recipients that You have modified the Original Work. + + 7. Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright in and to the Original Work and the patent rights granted herein by Licensor are owned by the Licensor or are sublicensed to You under the terms of this License with the permission of the contributor(s) of those copyrights and patent rights. Except as expressly stated in the immediately preceding sentence, the Original Work is provided under this License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without limitation, the warranties of non-infringement, merchantability or fitness for a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to the Original Work is granted by this License except under this disclaimer. + + 8. Limitation of Liability. Under no circumstances and under no legal theory, whether in tort (including negligence), contract, or otherwise, shall the Licensor be liable to anyone for any indirect, special, incidental, or consequential damages of any character arising as a result of this License or the use of the Original Work including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses. This limitation of liability shall not apply to the extent applicable law prohibits such limitation. + + 9. Acceptance and Termination. If, at any time, You expressly assented to this License, that assent indicates your clear and irrevocable acceptance of this License and all of its terms and conditions. If You distribute or communicate copies of the Original Work or a Derivative Work, You must make a reasonable effort under the circumstances to obtain the express assent of recipients to the terms of this License. This License conditions your rights to undertake the activities listed in Section 1, including your right to create Derivative Works based upon the Original Work, and doing so without honoring these terms and conditions is prohibited by copyright law and international treaty. Nothing in this License is intended to affect copyright exceptions and limitations (including "fair use" or "fair dealing"). This License shall terminate immediately and You may no longer exercise any of the rights granted to You by this License upon your failure to honor the conditions in Section 1(c). + + 10. Termination for Patent Action. This License shall terminate automatically and You may no longer exercise any of the rights granted to You by this License as of the date You commence an action, including a cross-claim or counterclaim, against Licensor or any licensee alleging that the Original Work infringes a patent. This termination provision shall not apply for an action alleging patent infringement by combinations of the Original Work with other software or hardware. + + 11. Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be brought only in the courts of a jurisdiction wherein the Licensor resides or in which Licensor conducts its primary business, and under the laws of that jurisdiction excluding its conflict-of-law provisions. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any use of the Original Work outside the scope of this License or after its termination shall be subject to the requirements and penalties of copyright or patent law in the appropriate jurisdiction. This section shall survive the termination of this License. + + 12. Attorneys' Fees. In any action to enforce the terms of this License or seeking damages relating thereto, the prevailing party shall be entitled to recover its costs and expenses, including, without limitation, reasonable attorneys' fees and costs incurred in connection with such action, including any appeal of such action. This section shall survive the termination of this License. + + 13. Miscellaneous. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. + + 14. Definition of "You" in This License. "You" throughout this License, whether in upper or lower case, means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with you. For purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + 15. Right to Use. You may use the Original Work in all ways not otherwise restricted or conditioned by this License or by law, and Licensor promises not to interfere with or be responsible for such uses by You. + + 16. Modification of This License. This License is Copyright � 2005 Lawrence Rosen. Permission is granted to copy, distribute, or communicate this License without modification. Nothing in this License permits You to modify this License as applied to the Original Work or to Derivative Works. However, You may modify the text of this License and copy, distribute or communicate your modified version (the "Modified License") and apply it to other original works of authorship subject to the following conditions: (i) You may not indicate in any way that your Modified License is the "Academic Free License" or "AFL" and you may not use those names in the name of your Modified License; (ii) You must replace the notice specified in the first paragraph above with the notice "Licensed under <insert your license name here>" or with a notice of your own that is not confusingly similar to the notice in this License; and (iii) You may not claim that your original works are open source software unless your Modified License has been approved by Open Source Initiative (OSI) and You comply with its license review and certification process. \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php new file mode 100644 index 00000000000..3925c76df08 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -0,0 +1,310 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdvancedPricingImportExport\Model\Import; + +use Magento\CatalogImportExport\Model\Import\Product as ImportProduct; +use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface; + +class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity +{ + const VALUE_ALL = 'all'; + + const COL_SKU = 'sku'; + + const COL_TIER_PRICE_WEBSITE = 'tier_price_website'; + + const COL_TIER_PRICE_CUSTOMER_GROUP = 'tier_price_customer_group'; + + const COL_TIER_PRICE_QTY = 'tier_price_qty'; + + const COL_TIER_PRICE = 'tier_price'; + + const COL_GROUP_PRICE_WEBSITE = 'group_price_website'; + + const COL_GROUP_PRICE_CUSTOMER_GROUP = 'group_price_customer_group'; + + const COL_GROUP_PRICE = 'group_price'; + + /** + * Validation failure message template definitions + * + * @var array + */ + protected $_messageTemplates = [ + ValidatorInterface::ERROR_INVALID_WEBSITE => 'Invalid value in Website column (website does not exists?)', + ValidatorInterface::ERROR_SKU_IS_EMPTY => 'SKU is empty', + ValidatorInterface::ERROR_NO_DEFAULT_ROW => 'Default values row does not exists', + ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE => 'Product with specified SKU not found', + ValidatorInterface::ERROR_INVALID_TIER_PRICE_QTY => 'Tier Price data price or quantity value is invalid', + ValidatorInterface::ERROR_INVALID_TIER_PRICE_SITE => 'Tier Price data website is invalid', + ValidatorInterface::ERROR_INVALID_TIER_PRICE_GROUP => 'Tier Price customer group ID is invalid', + ValidatorInterface::ERROR_TIER_DATA_INCOMPLETE => 'Tier Price data is incomplete', + ValidatorInterface::ERROR_INVALID_GROUP_PRICE_SITE => 'Group Price data website is invalid', + ValidatorInterface::ERROR_INVALID_GROUP_PRICE_GROUP => 'Group Price customer group ID is invalid', + ValidatorInterface::ERROR_GROUP_PRICE_DATA_INCOMPLETE => 'Group Price data is incomplete' + ]; + + /** @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory */ + protected $_resourceFactory; + + /** @var \Magento\Catalog\Helper\Data */ + protected $_catalogData; + + /** @var \Magento\Catalog\Model\Product */ + protected $_productModel; + + /** @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver */ + protected $_storeResolver; + + /** @var ImportProduct */ + protected $_importProduct; + + /** @var \Magento\Catalog\Model\Indexer\Product\Price\Processor */ + protected $_productPriceIndexerProcessor; + + protected $_validator; + + public function __construct( + \Magento\Framework\Json\Helper\Data $jsonHelper, + \Magento\ImportExport\Helper\Data $importExportData, + \Magento\ImportExport\Model\Resource\Helper $resourceHelper, + \Magento\ImportExport\Model\Resource\Import\Data $importData, + \Magento\Framework\App\Resource $resource, + \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory $resourceFactory, + \Magento\Catalog\Model\Product $productModel, + \Magento\Catalog\Helper\Data $catalogData, + \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver, + ImportProduct $importProduct + ) + { + $this->jsonHelper = $jsonHelper; + $this->_importExportData = $importExportData; + $this->_resourceHelper = $resourceHelper; + $this->_dataSourceModel = $importData; + $this->_connection = $resource->getConnection('write'); + $this->_resourceFactory = $resourceFactory; + $this->_productModel = $productModel; + $this->_catalogData = $catalogData; + $this->_storeResolver = $storeResolver; + $this->_importProduct = $importProduct; + } + + /** + * Entity type code getter. + * + * @return string + */ + public function getEntityTypeCode() + { + return 'advanced_pricing'; + } + + // todo + public function validateRow(array $rowData, $rowNum) + { + $sku = null; + + if (isset($this->_validatedRows[$rowNum])) { + return !isset($this->_invalidRows[$rowNum]); + } + $this->_validatedRows[$rowNum] = true; + + if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { + //todo +// if (false) { +// $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); +// return false; +// } + return true; + } + + if (!$this->_validator->isValid($rowData)) { + foreach ($this->_validator->getMessages() as $message) { + $this->addRowError($message, $rowNum); + } + } + + if (isset($rowData[self::COL_SKU])) { + $sku = $rowData[self::COL_SKU]; + } + if (null === $sku) { + $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); + } elseif (false === $sku) { + $this->addRowError(ValidatorInterface::ERROR_ROW_IS_ORPHAN, $rowNum); + } + + return !isset($this->_invalidRows[$rowNum]); + } + + /** + * Create Advanced price data from raw data. + * + * @throws \Exception + * @return bool Result of operation. + */ + protected function _importData() + { + if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { + $this->_deleteAdvancedPricing(); + } elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_REPLACE == $this->getBehavior()) { + $this->_replaceAdvancedPricing(); + } + $this->_saveAdvancedPricing(); + + return true; + } + + protected function _saveAdvancedPricing() + { + while ($bunch = $this->_dataSourceModel->getNextBunch()) { + $tierPrices = []; + $groupPrices = []; + foreach ($bunch as $rowNum => $rowData) { + if (!$this->validateRow($rowData, $rowNum)) { + continue; + } + $rowSku = $rowData[self::COL_SKU]; + if (!empty($rowData[self::COL_TIER_PRICE_WEBSITE])) { + $tierPrices[$rowSku][] = [ + 'all_groups' => $rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL, + 'customer_group_id' => $this->_getCustomerGroupId($rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP]), + 'qty' => $rowData[self::COL_TIER_PRICE_QTY], + 'value' => $rowData[self::COL_TIER_PRICE], + 'website_id' => $this->_getWebsiteId($rowData[self::COL_TIER_PRICE_WEBSITE]) + + ]; + } + if (!empty($rowData[self::COL_GROUP_PRICE_WEBSITE])) { + $groupPrices[$rowSku][] = [ + 'all_groups' => $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL, + 'customer_group_id' => $this->_getCustomerGroupId($rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP]), + 'value' => $rowData[self::COL_GROUP_PRICE], + 'website_id' => $this->_getWebSiteId($rowData[self::COL_GROUP_PRICE_WEBSITE]) + ]; + } + } + $this->_saveProductTierPrices($tierPrices) + ->_saveProductGroupPrices($groupPrices); + //$this->_gropedIndexer->reindexAll(); + } + } + + // todo + protected function _deleteAdvancedPricing() + { + return true; + } + + // todo + protected function _replaceAdvancedPricing() + { + return true; + } + + /** + * Save product tier prices. + * + * @param array $tierPriceData + * @return $this + */ + protected function _saveProductTierPrices(array $tierPriceData) + { + static $tableName = null; + $affectedIds = []; + + if (!$tableName) { + $tableName = $this->_resourceFactory->create()->getTable('catalog_product_entity_tier_price'); + } + if ($tierPriceData) { + $tierPriceIn = []; + + foreach ($tierPriceData as $delSku => $tierPriceRows) { + $productId = $this->_productModel->getIdBySku($delSku); + $affectedIds[] = $productId; + + foreach ($tierPriceRows as $row) { + $row['entity_id'] = $productId; + $tierPriceIn[] = $row; + } + } + if (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND != $this->getBehavior()) { + $this->_connection->delete( + $tableName, + $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) + ); + } + if ($tierPriceIn) { + $this->_connection->insertOnDuplicate($tableName, $tierPriceIn, ['value']); + } + } + + return $this; + } + + /** + * Save product group prices. + * + * @param array $groupPriceData + * @return $this + */ + protected function _saveProductGroupPrices(array $groupPriceData) + { + static $tableName = null; + $affectedIds = []; + + if (!$tableName) { + $tableName = $this->_resourceFactory->create()->getTable('catalog_product_entity_group_price'); + } + if ($groupPriceData) { + $groupPriceIn = []; + + foreach ($groupPriceData as $delSku => $groupPriceRows) { + $productId = $this->_productModel->getIdBySku($delSku); + $affectedIds[] = $productId; + + foreach ($groupPriceRows as $row) { + $row['entity_id'] = $productId; + $groupPriceIn[] = $row; + } + } + if (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND != $this->getBehavior()) { + $this->_connection->delete( + $tableName, + $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) + ); + } + if ($groupPriceIn) { + $this->_connection->insertOnDuplicate($tableName, $groupPriceIn, ['value']); + } + } + + return $this; + } + + /** + * Get website id by code + * + * @param $websiteCode + * @return array|int|string + */ + protected function _getWebSiteId($websiteCode) + { + $result = $websiteCode == self::VALUE_ALL || + $this->_catalogData->isPriceGlobal() ? 0 : $this->_storeResolver->getWebsiteCodeToId($websiteCode); + return $result; + } + + /** + * Get customer group id + * + * @param string $customerGroup + * @return int + */ + protected function _getCustomerGroupId($customerGroup) + { + return $customerGroup == self::VALUE_ALL ? 0 : $customerGroup; + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php new file mode 100644 index 00000000000..42af865fbd6 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php @@ -0,0 +1,49 @@ +<?php + +namespace Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; + +use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface; +use \Magento\Framework\Validator\AbstractValidator; + +class Validator extends AbstractValidator implements RowValidatorInterface +{ + /** + * @var RowValidatorInterface[]|AbstractValidator[] + */ + protected $validators = []; + + /** + * @param RowValidatorInterface[] $validators + */ + public function __construct($validators = []) + { + $this->validators = $validators; + } + + /** + * @param array $value + * @return bool + */ + public function isValid($value) + { + $returnValue = true; + $this->_clearMessages(); + foreach ($this->validators as $validator) { + if (!$validator->isValid($value)) { + $returnValue = false; + $this->_addMessages($validator->getMessages()); + } + } + return $returnValue; + } + + /** + * Init validators + */ + public function init() + { + foreach ($this->validators as $validator) { + $validator->init(); + } + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php new file mode 100644 index 00000000000..b48df063964 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php @@ -0,0 +1,115 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator; + +use Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; + +class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Validator\AbstractPrice +{ + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver + */ + protected $storeResolver; + + /** + * @var array + */ + private $_groupPriceColumns = [ + AdvancedPricing::COL_GROUP_PRICE_WEBSITE, + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP, + AdvancedPricing::COL_GROUP_PRICE + ]; + + /** + * @param \Magento\Customer\Api\GroupRepositoryInterface $groupRepository + * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder + * @param \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver + */ + public function __construct( + \Magento\Customer\Api\GroupRepositoryInterface $groupRepository, + \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder, + \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver + ) { + $this->storeResolver = $storeResolver; + parent::__construct($groupRepository, $searchCriteriaBuilder); + } + + + /** + * Call parent init() + * + * @return $this + */ + public function init() + { + return parent::init(); + } + + /** + * Validate value + * + * @param array $value + * @return bool + */ + public function isValid($value) + { + $this->_clearMessages(); + if ($this->_isValidValueAndLength($value)) { + if (!isset($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE]) + || !isset($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]) + || $this->_hasEmptyColumns($value)) { + $this->_addMessages([self::ERROR_GROUP_PRICE_DATA_INCOMPLETE]); + return false; + } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE] != self::VALUE_ALL + && !$this->storeResolver->getWebsiteCodeToId($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE]) + ) { + $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_SITE]); + return false; + } elseif (!isset($this->customerGroups[$value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]]) + && $value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] != self::VALUE_ALL + ) { + $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_GROUP]); + return false; + } + } + return true; + } + + /** + * Check if at list one value and length are valid + * + * @param array $value + * @return bool + */ + protected function _isValidValueAndLength(array $value) + { + $isValid = false; + foreach ($this->_groupPriceColumns as $column) { + if (isset($value[$column]) && strlen($value[$column])) { + $isValid = true; + } + } + return $isValid; + } + + /** + * Check if value has empty columns + * + * @param array $value + * @return bool + */ + protected function _hasEmptyColumns(array $value) + { + $hasEmptyValues = false; + foreach ($this->_groupPriceColumns as $column) { + if (!strlen($value[$column])) { + $hasEmptyValues = true; + } + } + return $hasEmptyValues; + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php new file mode 100644 index 00000000000..cde6d712bbc --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php @@ -0,0 +1,120 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator; + +use Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; + +class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Validator\AbstractPrice +{ + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver + */ + protected $storeResolver; + + /** + * @var array + */ + private $_tierPriceColumns = [ + AdvancedPricing::COL_TIER_PRICE_WEBSITE, + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP, + AdvancedPricing::COL_TIER_PRICE_QTY, + AdvancedPricing::COL_TIER_PRICE + ]; + + /** + * @param \Magento\Customer\Api\GroupRepositoryInterface $groupRepository + * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder + * @param \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver + */ + public function __construct( + \Magento\Customer\Api\GroupRepositoryInterface $groupRepository, + \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder, + \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver + ) { + $this->storeResolver = $storeResolver; + parent::__construct($groupRepository, $searchCriteriaBuilder); + } + + /** + * Call parent init() + * + * @return $this + */ + public function init() + { + return parent::init(); + } + + /** + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->_clearMessages(); + if ($this->_isValidValueAndLength($value)) { + if (!isset($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE]) + || !isset($value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP]) + || !isset($value[AdvancedPricing::COL_TIER_PRICE_QTY]) + || !isset($value[AdvancedPricing::COL_TIER_PRICE]) + || $this->_hasEmptyColumns($value) + ) { + $this->_addMessages([self::ERROR_TIER_DATA_INCOMPLETE]); + return false; + } elseif ($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE] != self::VALUE_ALL + && !$this->storeResolver->getWebsiteCodeToId($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE]) + ) { + $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_SITE]); + return false; + } elseif ($value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP] != self::VALUE_ALL && !isset( + $this->customerGroups[$value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP]] + ) + ) { + $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_GROUP]); + return false; + } elseif ($value[AdvancedPricing::COL_TIER_PRICE_QTY] <= 0 || $value['tier_price'] <= 0) { + $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_QTY]); + return false; + } + } + return true; + } + + /** + * Check if at list one value and length are valid + * + * @param array $value + * @return bool + */ + protected function _isValidValueAndLength(array $value) + { + $isValid = false; + foreach ($this->_tierPriceColumns as $column) { + if (isset($value[$column]) && strlen($value[$column])) { + $isValid = true; + } + } + return $isValid; + } + + /** + * Check if value has empty columns + * + * @param array $value + * @return bool + */ + protected function _hasEmptyColumns(array $value) + { + $hasEmptyValues = false; + foreach ($this->_tierPriceColumns as $column) { + if (!strlen($value[$column])) { + $hasEmptyValues = true; + } + } + return $hasEmptyValues; + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/README.md b/app/code/Magento/AdvancedPricingImportExport/README.md new file mode 100644 index 00000000000..581a3a91c8a --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/README.md @@ -0,0 +1 @@ +The Magento_AdvancedPricingImportExport module handles the import and export of the advanced pricing. \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/composer.json b/app/code/Magento/AdvancedPricingImportExport/composer.json new file mode 100644 index 00000000000..fb075809d50 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/composer.json @@ -0,0 +1,27 @@ +{ + "name": "magento/module-advanced-pricing-import-export", + "description": "N/A", + "require": { + "php": "~5.5.0|~5.6.0", + "magento/module-catalog": "0.74.0-beta7", + "magento/module-import-export": "0.74.0-beta7", + "magento/module-catalog-import-export": "0.74.0-beta7", + "magento/module-eav": "0.74.0-beta7", + "magento/framework": "0.74.0-beta7", + "magento/magento-composer-installer": "*" + }, + "type": "magento2-module", + "version": "0.74.0-beta7", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "extra": { + "map": [ + [ + "*", + "Magento/AdvancedPricingImportExport" + ] + ] + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/etc/di.xml b/app/code/Magento/AdvancedPricingImportExport/etc/di.xml new file mode 100644 index 00000000000..87663937093 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/etc/di.xml @@ -0,0 +1,17 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd"> + <type name="Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator"> + <arguments> + <argument name="validators" xsi:type="array"> + <item name="groupPrice" xsi:type="object">Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice</item> + <item name="tierPrice" xsi:type="object">Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\TierPrice</item> + </argument> + </arguments> + </type> +</config> diff --git a/app/code/Magento/AdvancedPricingImportExport/etc/import.xml b/app/code/Magento/AdvancedPricingImportExport/etc/import.xml new file mode 100644 index 00000000000..0d113f745d6 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/etc/import.xml @@ -0,0 +1,10 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../ImportExport/etc/import.xsd"> + <entity name="advanced_pricing" label="Advanced Pricing" model="Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing" behaviorModel="Magento\ImportExport\Model\Source\Import\Behavior\Basic" /> +</config> \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/etc/module.xml b/app/code/Magento/AdvancedPricingImportExport/etc/module.xml new file mode 100644 index 00000000000..ef30304b507 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/etc/module.xml @@ -0,0 +1,11 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd"> + <module name="Magento_AdvancedPricingImportExport" setup_version="2.0.0"> + </module> +</config> -- GitLab From e609da3c988207c596522e9870659304d48d825b Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Tue, 26 May 2015 14:13:38 +0300 Subject: [PATCH 189/396] MAGNIMEX-183: Import advanced price - validator --- .../Model/Import/AdvancedPricing.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 3925c76df08..4d5bbf3bdd7 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -77,7 +77,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract \Magento\Catalog\Model\Product $productModel, \Magento\Catalog\Helper\Data $catalogData, \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver, - ImportProduct $importProduct + ImportProduct $importProduct, + AdvancedPricing\Validator $validator ) { $this->jsonHelper = $jsonHelper; @@ -90,6 +91,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $this->_catalogData = $catalogData; $this->_storeResolver = $storeResolver; $this->_importProduct = $importProduct; + $this->_validator = $validator; } /** @@ -188,7 +190,6 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } $this->_saveProductTierPrices($tierPrices) ->_saveProductGroupPrices($groupPrices); - //$this->_gropedIndexer->reindexAll(); } } -- GitLab From 0b2534390a6a1087c7b52fea1787f27922e6d131 Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Wed, 27 May 2015 11:55:49 +0300 Subject: [PATCH 190/396] MAGNIMEX-10: Delete Advanced Prices --- .../Model/Import/AdvancedPricing.php | 63 ++++++++++++++++--- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 4d5bbf3bdd7..1c50043ad71 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -115,11 +115,10 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $this->_validatedRows[$rowNum] = true; if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { - //todo -// if (false) { -// $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); -// return false; -// } + if (false) { + $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); + return false; + } return true; } @@ -153,8 +152,9 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $this->_deleteAdvancedPricing(); } elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_REPLACE == $this->getBehavior()) { $this->_replaceAdvancedPricing(); + } elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_ADD_UPDATE == $this->getBehavior()) { + $this->_saveAdvancedPricing(); } - $this->_saveAdvancedPricing(); return true; } @@ -193,10 +193,25 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } } - // todo + /** + * Deletes Advanced price data from raw data. + */ protected function _deleteAdvancedPricing() { - return true; + $listSku = []; + while ($bunch = $this->_dataSourceModel->getNextBunch()) { + foreach ($bunch as $rowNum => $rowData) { + if (!$this->validateRow($rowData, $rowNum)) { + continue; + } + $rowSku = $rowData[self::COL_SKU]; + $listSku[] = $rowSku; + } + } + if($listSku) { + $this->_deleteProductTierAndGroupPrices(self::COL_GROUP_PRICE, array_unique($listSku)) + ->_deleteProductTierAndGroupPrices(self::COL_TIER_PRICE, array_unique($listSku)); + } } // todo @@ -285,6 +300,38 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract return $this; } + /** + * Deletes tier prices and group prices. + * + * @param $advancedTypePrice + * @param array $listSku + * @return $this + */ + protected function _deleteProductTierAndGroupPrices($advancedTypePrice, array $listSku) + { + $tableName = null; + if(isset($advancedTypePrice)) { + if (!$tableName) { + $tableName = $this->_resourceFactory->create()->getTable('catalog_product_entity_' . $advancedTypePrice); + } + } + if($tableName) { + if($listSku) { + foreach ($listSku as $delSku) { + $productId = $this->_productModel->getIdBySku($delSku); + $affectedIds[] = $productId; + } + + $this->_connection->delete( + $tableName, + $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) + ); + } + } + + return $this; + } + /** * Get website id by code * -- GitLab From 210075627b61c887ee7672b558816787390f6f5d Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Wed, 27 May 2015 12:25:16 +0300 Subject: [PATCH 191/396] MAGNIMEX-183: Import advanced prices - save group and tier prices --- .../Model/Import/AdvancedPricing.php | 177 ++++-------------- .../AdvancedPricing/Validator/GroupPrice.php | 4 +- .../AdvancedPricingImportExport/etc/di.xml | 3 + 3 files changed, 46 insertions(+), 138 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 1c50043ad71..e0ce0618597 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -28,6 +28,10 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract const COL_GROUP_PRICE = 'group_price'; + const TABLE_TIER_PRICE = 'catalog_product_entity_tier_price'; + + const TABLE_GROUPED_PRICE = 'catalog_product_entity_group_price'; + /** * Validation failure message template definitions * @@ -62,9 +66,6 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract /** @var ImportProduct */ protected $_importProduct; - /** @var \Magento\Catalog\Model\Indexer\Product\Price\Processor */ - protected $_productPriceIndexerProcessor; - protected $_validator; public function __construct( @@ -107,7 +108,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract // todo public function validateRow(array $rowData, $rowNum) { - $sku = null; + $sku = false; if (isset($this->_validatedRows[$rowNum])) { return !isset($this->_invalidRows[$rowNum]); @@ -115,10 +116,11 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $this->_validatedRows[$rowNum] = true; if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { - if (false) { - $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); - return false; - } + //todo +// if (false) { +// $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); +// return false; +// } return true; } @@ -149,17 +151,17 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract protected function _importData() { if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { - $this->_deleteAdvancedPricing(); + $this->deleteAdvancedPricing(); } elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_REPLACE == $this->getBehavior()) { - $this->_replaceAdvancedPricing(); - } elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_ADD_UPDATE == $this->getBehavior()) { - $this->_saveAdvancedPricing(); + $this->replaceAdvancedPricing(); + } else { + $this->saveAdvancedPricing(); } return true; } - protected function _saveAdvancedPricing() + public function saveAdvancedPricing() { while ($bunch = $this->_dataSourceModel->getNextBunch()) { $tierPrices = []; @@ -172,163 +174,66 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract if (!empty($rowData[self::COL_TIER_PRICE_WEBSITE])) { $tierPrices[$rowSku][] = [ 'all_groups' => $rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL, - 'customer_group_id' => $this->_getCustomerGroupId($rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP]), + 'customer_group_id' => $this->getCustomerGroupId($rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP]), 'qty' => $rowData[self::COL_TIER_PRICE_QTY], 'value' => $rowData[self::COL_TIER_PRICE], - 'website_id' => $this->_getWebsiteId($rowData[self::COL_TIER_PRICE_WEBSITE]) + 'website_id' => $this->getWebsiteId($rowData[self::COL_TIER_PRICE_WEBSITE]) ]; } if (!empty($rowData[self::COL_GROUP_PRICE_WEBSITE])) { $groupPrices[$rowSku][] = [ 'all_groups' => $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL, - 'customer_group_id' => $this->_getCustomerGroupId($rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP]), + 'customer_group_id' => $this->getCustomerGroupId($rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP]), 'value' => $rowData[self::COL_GROUP_PRICE], - 'website_id' => $this->_getWebSiteId($rowData[self::COL_GROUP_PRICE_WEBSITE]) + 'website_id' => $this->getWebSiteId($rowData[self::COL_GROUP_PRICE_WEBSITE]) ]; } } - $this->_saveProductTierPrices($tierPrices) - ->_saveProductGroupPrices($groupPrices); - } - } - - /** - * Deletes Advanced price data from raw data. - */ - protected function _deleteAdvancedPricing() - { - $listSku = []; - while ($bunch = $this->_dataSourceModel->getNextBunch()) { - foreach ($bunch as $rowNum => $rowData) { - if (!$this->validateRow($rowData, $rowNum)) { - continue; - } - $rowSku = $rowData[self::COL_SKU]; - $listSku[] = $rowSku; - } - } - if($listSku) { - $this->_deleteProductTierAndGroupPrices(self::COL_GROUP_PRICE, array_unique($listSku)) - ->_deleteProductTierAndGroupPrices(self::COL_TIER_PRICE, array_unique($listSku)); + $this->saveProductPrices($tierPrices, self::TABLE_TIER_PRICE) + ->saveProductPrices($groupPrices, self::TABLE_GROUPED_PRICE); } } // todo - protected function _replaceAdvancedPricing() + protected function deleteAdvancedPricing() { return true; } - /** - * Save product tier prices. - * - * @param array $tierPriceData - * @return $this - */ - protected function _saveProductTierPrices(array $tierPriceData) + // todo + protected function replaceAdvancedPricing() { - static $tableName = null; - $affectedIds = []; - - if (!$tableName) { - $tableName = $this->_resourceFactory->create()->getTable('catalog_product_entity_tier_price'); - } - if ($tierPriceData) { - $tierPriceIn = []; - - foreach ($tierPriceData as $delSku => $tierPriceRows) { - $productId = $this->_productModel->getIdBySku($delSku); - $affectedIds[] = $productId; - - foreach ($tierPriceRows as $row) { - $row['entity_id'] = $productId; - $tierPriceIn[] = $row; - } - } - if (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND != $this->getBehavior()) { - $this->_connection->delete( - $tableName, - $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) - ); - } - if ($tierPriceIn) { - $this->_connection->insertOnDuplicate($tableName, $tierPriceIn, ['value']); - } - } - - return $this; + return true; } /** - * Save product group prices. + * Save product prices. * - * @param array $groupPriceData + * @param array $priceData + * @param string $table * @return $this */ - protected function _saveProductGroupPrices(array $groupPriceData) + protected function saveProductPrices(array $priceData, $table) { - static $tableName = null; - $affectedIds = []; - - if (!$tableName) { - $tableName = $this->_resourceFactory->create()->getTable('catalog_product_entity_group_price'); - } - if ($groupPriceData) { - $groupPriceIn = []; + if ($priceData) { + $affectedIds = []; + $tableName = $this->_resourceFactory->create()->getTable($table); + $priceIn = []; - foreach ($groupPriceData as $delSku => $groupPriceRows) { - $productId = $this->_productModel->getIdBySku($delSku); + foreach ($priceData as $sku => $priceRows) { + $productId = $this->_productModel->getIdBySku($sku); $affectedIds[] = $productId; - foreach ($groupPriceRows as $row) { + foreach ($priceRows as $row) { $row['entity_id'] = $productId; - $groupPriceIn[] = $row; + $priceIn[] = $row; } } - if (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND != $this->getBehavior()) { - $this->_connection->delete( - $tableName, - $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) - ); - } - if ($groupPriceIn) { - $this->_connection->insertOnDuplicate($tableName, $groupPriceIn, ['value']); - } - } - - return $this; - } - - /** - * Deletes tier prices and group prices. - * - * @param $advancedTypePrice - * @param array $listSku - * @return $this - */ - protected function _deleteProductTierAndGroupPrices($advancedTypePrice, array $listSku) - { - $tableName = null; - if(isset($advancedTypePrice)) { - if (!$tableName) { - $tableName = $this->_resourceFactory->create()->getTable('catalog_product_entity_' . $advancedTypePrice); - } - } - if($tableName) { - if($listSku) { - foreach ($listSku as $delSku) { - $productId = $this->_productModel->getIdBySku($delSku); - $affectedIds[] = $productId; - } - - $this->_connection->delete( - $tableName, - $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) - ); + if ($priceIn) { + $this->_connection->insertOnDuplicate($tableName, $priceIn, ['value']); } } - return $this; } @@ -338,7 +243,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract * @param $websiteCode * @return array|int|string */ - protected function _getWebSiteId($websiteCode) + protected function getWebSiteId($websiteCode) { $result = $websiteCode == self::VALUE_ALL || $this->_catalogData->isPriceGlobal() ? 0 : $this->_storeResolver->getWebsiteCodeToId($websiteCode); @@ -351,7 +256,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract * @param string $customerGroup * @return int */ - protected function _getCustomerGroupId($customerGroup) + protected function getCustomerGroupId($customerGroup) { return $customerGroup == self::VALUE_ALL ? 0 : $customerGroup; } diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php index b48df063964..e258ccf6a4b 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php @@ -69,8 +69,8 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid ) { $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_SITE]); return false; - } elseif (!isset($this->customerGroups[$value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]]) - && $value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] != self::VALUE_ALL + } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] != self::VALUE_ALL + && !isset($this->customerGroups[$value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]]) ) { $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_GROUP]); return false; diff --git a/app/code/Magento/AdvancedPricingImportExport/etc/di.xml b/app/code/Magento/AdvancedPricingImportExport/etc/di.xml index 87663937093..9728d7e6568 100644 --- a/app/code/Magento/AdvancedPricingImportExport/etc/di.xml +++ b/app/code/Magento/AdvancedPricingImportExport/etc/di.xml @@ -6,6 +6,9 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd"> + <type name="Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing"> + <plugin name="invalidateAdvancedPriceIndexerOnImport" type="Magento\AdvancedPricingImportExport\Model\Indexer\Product\Price\Plugin\Import" /> + </type> <type name="Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator"> <arguments> <argument name="validators" xsi:type="array"> -- GitLab From 010089eb56fd63dfcd71dd4a1dcda815927c9cc0 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Wed, 27 May 2015 12:32:29 +0300 Subject: [PATCH 192/396] MAGNIMEX-183: Import advanced prices - price import plugin --- .../Indexer/Product/Price/Plugin/Import.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php new file mode 100644 index 00000000000..1518e0f4b95 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php @@ -0,0 +1,17 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdvancedPricingImportExport\Model\Indexer\Product\Price\Plugin; + +class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\AbstractPlugin +{ + /** + * After import handler + */ + public function afterSaveAdvancedPricing() + { + $this->invalidateIndexer(); + } +} -- GitLab From f33e9af3279583440d6f14d2093634759fbb63ec Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Wed, 27 May 2015 17:48:22 +0300 Subject: [PATCH 193/396] MAGNIMEX-6: Import AdvancedPricing --- .../Model/Import/AdvancedPricing.php | 76 +++++++++++++++---- .../Indexer/Product/Price/Plugin/Import.php | 16 ++++ composer.json | 1 + 3 files changed, 78 insertions(+), 15 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index e0ce0618597..91ad091f923 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -109,27 +109,22 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract public function validateRow(array $rowData, $rowNum) { $sku = false; - if (isset($this->_validatedRows[$rowNum])) { return !isset($this->_invalidRows[$rowNum]); } $this->_validatedRows[$rowNum] = true; - if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { - //todo -// if (false) { -// $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); -// return false; -// } + if (false) { + $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); + return false; + } return true; } - if (!$this->_validator->isValid($rowData)) { foreach ($this->_validator->getMessages() as $message) { $this->addRowError($message, $rowNum); } } - if (isset($rowData[self::COL_SKU])) { $sku = $rowData[self::COL_SKU]; } @@ -138,7 +133,6 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } elseif (false === $sku) { $this->addRowError(ValidatorInterface::ERROR_ROW_IS_ORPHAN, $rowNum); } - return !isset($this->_invalidRows[$rowNum]); } @@ -154,13 +148,16 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $this->deleteAdvancedPricing(); } elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_REPLACE == $this->getBehavior()) { $this->replaceAdvancedPricing(); - } else { + } elseif (\Magento\ImportExport\Model\Import::BEHAVIOR_APPEND == $this->getBehavior()) { $this->saveAdvancedPricing(); } return true; } + /** + * Save advanced pricing + */ public function saveAdvancedPricing() { while ($bunch = $this->_dataSourceModel->getNextBunch()) { @@ -195,10 +192,28 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } } - // todo + /** + * Deletes Advanced price data from raw data. + */ protected function deleteAdvancedPricing() { - return true; + $listSku = []; + while ($bunch = $this->_dataSourceModel->getNextBunch()) { + foreach ($bunch as $rowNum => $rowData) { + if (!$this->validateRow($rowData, $rowNum)) { + continue; + } else { + $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); + return false; + } + $rowSku = $rowData[self::COL_SKU]; + $listSku[] = $rowSku; + } + } + if ($listSku) { + $this->deleteProductTierAndGroupPrices(array_unique($listSku), self::TABLE_GROUPED_PRICE) + ->deleteProductTierAndGroupPrices(array_unique($listSku), self::TABLE_TIER_PRICE); + } } // todo @@ -220,11 +235,9 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $affectedIds = []; $tableName = $this->_resourceFactory->create()->getTable($table); $priceIn = []; - foreach ($priceData as $sku => $priceRows) { $productId = $this->_productModel->getIdBySku($sku); $affectedIds[] = $productId; - foreach ($priceRows as $row) { $row['entity_id'] = $productId; $priceIn[] = $row; @@ -237,6 +250,39 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract return $this; } + /** + * Deletes tier prices and group prices. + * + * @param array $listSku + * @param $table + * @return $this + */ + protected function deleteProductTierAndGroupPrices(array $listSku, $table) + { + if (isset($table)) { + $tableName = $this->_resourceFactory->create()->getTable($table); + } + if ($tableName) { + if ($listSku) { + foreach ($listSku as $delSku) { + $productId = $this->_productModel->getIdBySku($delSku); + $affectedIds[] = $productId; + } + if($affectedIds) { + $this->_connection->delete( + $tableName, + $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) + ); + $this->_productModel->cleanCache(); + } else { + $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, 0); + return false; + } + } + } + return $this; + } + /** * Get website id by code * diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php index 1518e0f4b95..37a2e4878ca 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php @@ -14,4 +14,20 @@ class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\Abstrac { $this->invalidateIndexer(); } + + /** + * After delete handler + */ + public function afterDeleteAdvancedPricing() + { + $this->invalidateIndexer(); + } + + /** + * After replace handler + */ + public function afterReplaceAdvancedPricing() + { + $this->invalidateIndexer(); + } } diff --git a/composer.json b/composer.json index 1879c7e9d60..f22451f836b 100644 --- a/composer.json +++ b/composer.json @@ -61,6 +61,7 @@ }, "replace": { "magento/module-admin-notification": "self.version", + "magento/module-advanced-pricing-import-export": "self.version", "magento/module-authorization": "self.version", "magento/module-backend": "self.version", "magento/module-backup": "self.version", -- GitLab From 200d545177ff96acdee1785b69deea3d10a71a07 Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Thu, 28 May 2015 00:22:10 +0300 Subject: [PATCH 194/396] MAGNIMEX-10: Fix logic in method deleteProductTierAndGroupPrices --- .../Model/Import/AdvancedPricing.php | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 91ad091f923..8cfd3eca03a 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -68,6 +68,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract protected $_validator; + protected $_cachedSkuToDelete; + public function __construct( \Magento\Framework\Json\Helper\Data $jsonHelper, \Magento\ImportExport\Helper\Data $importExportData, @@ -197,6 +199,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected function deleteAdvancedPricing() { + $this->_cachedSkuToDelete = null; $listSku = []; while ($bunch = $this->_dataSourceModel->getNextBunch()) { foreach ($bunch as $rowNum => $rowData) { @@ -254,26 +257,23 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract * Deletes tier prices and group prices. * * @param array $listSku - * @param $table + * @param string $tableName * @return $this */ - protected function deleteProductTierAndGroupPrices(array $listSku, $table) + protected function deleteProductTierAndGroupPrices(array $listSku, $tableName) { - if (isset($table)) { - $tableName = $this->_resourceFactory->create()->getTable($table); - } if ($tableName) { if ($listSku) { - foreach ($listSku as $delSku) { - $productId = $this->_productModel->getIdBySku($delSku); - $affectedIds[] = $productId; + if(!$this->_cachedSkuToDelete) { + $this->_cachedSkuToDelete = $this->_connection->fetchCol($this->_connection->select() + ->from($this->_connection->getTableName('catalog_product_entity'), 'entity_id') + ->where('sku IN (?)', $listSku)); } - if($affectedIds) { + if($this->_cachedSkuToDelete) { $this->_connection->delete( $tableName, - $this->_connection->quoteInto('entity_id IN (?)', $affectedIds) + $this->_connection->quoteInto('entity_id IN (?)', $this->_cachedSkuToDelete) ); - $this->_productModel->cleanCache(); } else { $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, 0); return false; -- GitLab From f8ce804d313ccf39fb6e17ee9bd3fbaa743c9352 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Thu, 28 May 2015 02:32:09 +0300 Subject: [PATCH 195/396] MAGNIMEX-183: Import advanced prices - sku cache --- .../Model/Import/AdvancedPricing.php | 57 +++++++++++++++---- .../AdvancedPricingImportExport/etc/di.xml | 1 + 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 8cfd3eca03a..bca7f9c51b1 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -12,6 +12,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract { const VALUE_ALL = 'all'; + const VALUE_ALL_GROUPS = 'ALL GROUPS'; + const COL_SKU = 'sku'; const COL_TIER_PRICE_WEBSITE = 'tier_price_website'; @@ -48,7 +50,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract ValidatorInterface::ERROR_TIER_DATA_INCOMPLETE => 'Tier Price data is incomplete', ValidatorInterface::ERROR_INVALID_GROUP_PRICE_SITE => 'Group Price data website is invalid', ValidatorInterface::ERROR_INVALID_GROUP_PRICE_GROUP => 'Group Price customer group ID is invalid', - ValidatorInterface::ERROR_GROUP_PRICE_DATA_INCOMPLETE => 'Group Price data is incomplete' + ValidatorInterface::ERROR_GROUP_PRICE_DATA_INCOMPLETE => 'Group Price data is incomplete', + ValidatorInterface::ERROR_INVALID_WEBSITE => 'Website data is invalid' ]; /** @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory */ @@ -66,10 +69,15 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract /** @var ImportProduct */ protected $_importProduct; + /** @var AdvancedPricing\Validator */ protected $_validator; + /** @var array */ protected $_cachedSkuToDelete; + /** @var array */ + protected $_oldSkus; + public function __construct( \Magento\Framework\Json\Helper\Data $jsonHelper, \Magento\ImportExport\Helper\Data $importExportData, @@ -95,6 +103,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $this->_storeResolver = $storeResolver; $this->_importProduct = $importProduct; $this->_validator = $validator; + $this->_oldSkus = $this->retrieveOldSkus(); } /** @@ -107,7 +116,13 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract return 'advanced_pricing'; } - // todo + /** + * Row validation. + * + * @param array $rowData + * @param int $rowNum + * @return bool + */ public function validateRow(array $rowData, $rowNum) { $sku = false; @@ -172,7 +187,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $rowSku = $rowData[self::COL_SKU]; if (!empty($rowData[self::COL_TIER_PRICE_WEBSITE])) { $tierPrices[$rowSku][] = [ - 'all_groups' => $rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL, + 'all_groups' => $rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS, 'customer_group_id' => $this->getCustomerGroupId($rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP]), 'qty' => $rowData[self::COL_TIER_PRICE_QTY], 'value' => $rowData[self::COL_TIER_PRICE], @@ -182,7 +197,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } if (!empty($rowData[self::COL_GROUP_PRICE_WEBSITE])) { $groupPrices[$rowSku][] = [ - 'all_groups' => $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL, + 'all_groups' => $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS, 'customer_group_id' => $this->getCustomerGroupId($rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP]), 'value' => $rowData[self::COL_GROUP_PRICE], 'website_id' => $this->getWebSiteId($rowData[self::COL_GROUP_PRICE_WEBSITE]) @@ -219,10 +234,14 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } } - // todo - protected function replaceAdvancedPricing() + /** + * Replace advanced pricing + * + * @return bool + */ + protected function replaceAdvancedPricing() { - return true; + //todo implement replace } /** @@ -235,12 +254,10 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract protected function saveProductPrices(array $priceData, $table) { if ($priceData) { - $affectedIds = []; $tableName = $this->_resourceFactory->create()->getTable($table); $priceIn = []; foreach ($priceData as $sku => $priceRows) { - $productId = $this->_productModel->getIdBySku($sku); - $affectedIds[] = $productId; + $productId = $this->_oldSkus[$sku]; foreach ($priceRows as $row) { $row['entity_id'] = $productId; $priceIn[] = $row; @@ -304,6 +321,24 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected function getCustomerGroupId($customerGroup) { - return $customerGroup == self::VALUE_ALL ? 0 : $customerGroup; + return $customerGroup == self::VALUE_ALL_GROUPS + ? \Magento\Customer\Model\Group::CUST_GROUP_ALL + : $customerGroup; + } + + /** + * Retrieve product skus + * + * @return array + */ + protected function retrieveOldSkus() + { + $oldSkus = $this->_connection->fetchPairs( + $this->_connection->select()->from( + $this->_connection->getTableName('catalog_product_entity'), + ['sku', 'entity_id'] + ) + ); + return $oldSkus; } } \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/etc/di.xml b/app/code/Magento/AdvancedPricingImportExport/etc/di.xml index 9728d7e6568..eb738446923 100644 --- a/app/code/Magento/AdvancedPricingImportExport/etc/di.xml +++ b/app/code/Magento/AdvancedPricingImportExport/etc/di.xml @@ -14,6 +14,7 @@ <argument name="validators" xsi:type="array"> <item name="groupPrice" xsi:type="object">Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice</item> <item name="tierPrice" xsi:type="object">Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\TierPrice</item> + <item name="website" xsi:type="object">Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website</item> </argument> </arguments> </type> -- GitLab From eb2a26b05c59d6d5319a70f9fba63235f29b323d Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Thu, 28 May 2015 09:25:46 +0000 Subject: [PATCH 196/396] MAGNIMEX-99: fix unit test for GroupedTest.php --- .../Model/Import/Product/Type/GroupedTest.php | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php b/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php index 64a39e61c95..d9fcf1530d1 100644 --- a/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php +++ b/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php @@ -47,6 +47,17 @@ class GroupedTest extends \PHPUnit_Framework_TestCase */ protected $entityModel; + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resource; + + /** + * @var \Magento\Framework\DB\Adapter\Pdo\Mysql|\PHPUnit_Framework_MockObject_MockObject + */ + protected $connection; + + protected function setUp() { $this->setCollectionFactory = $this->getMock( @@ -77,6 +88,14 @@ class GroupedTest extends \PHPUnit_Framework_TestCase '', false ); + + $attrCollection = $this->getMock('\Magento\Catalog\Model\Resource\Product\Attribute\Collection', [], [], '', false); + $attrCollection->expects($this->any())->method('addFieldToFilter')->willReturn([]); + + $this->attrCollectionFactory->expects($this->any())->method('create')->will( + $this->returnValue($attrCollection) + ); + $this->entityModel = $this->getMock( 'Magento\CatalogImportExport\Model\Import\Product', ['getNewSku', 'getOldSku', 'getNextBunch', 'isRowAllowedToImport', 'getRowScope'], @@ -96,12 +115,48 @@ class GroupedTest extends \PHPUnit_Framework_TestCase false ); + $this->connection = $this->getMock( + 'Magento\Framework\DB\Adapter\Pdo\Mysql', + ['select', 'fetchAll', 'fetchPairs', 'joinLeft', 'insertOnDuplicate', 'delete', 'quoteInto', 'fetchAssoc'], + [], + '', + false + ); + + $select = $this->getMock('Magento\Framework\DB\Select', [], [], '', false); + $select->expects($this->any())->method('from')->will($this->returnSelf()); + $select->expects($this->any())->method('where')->will($this->returnSelf()); + $select->expects($this->any())->method('joinLeft')->will($this->returnSelf()); + $adapter = $this->getMock('Magento\Framework\DB\Adapter\Pdo\Mysql', [], [], '', false); + $adapter->expects($this->any())->method('quoteInto')->will($this->returnValue('query')); + $select->expects($this->any())->method('getAdapter')->willReturn($adapter); + $this->connection->expects($this->any())->method('select')->will($this->returnValue($select)); + $this->connection->expects($this->any())->method('fetchPairs')->will($this->returnValue([ + '1' => '1', '2' => '2' + ])); + + $this->resource = $this->getMock( + 'Magento\Framework\App\Resource', + ['getConnection', 'getTableName'], + [], + '', + false + ); + + $this->resource->expects($this->any())->method('getConnection')->will( + $this->returnValue($this->connection) + ); + $this->resource->expects($this->any())->method('getTableName')->will( + $this->returnValue('tableName') + ); + $this->objectManagerHelper = new ObjectManagerHelper($this); $this->grouped = $this->objectManagerHelper->getObject( 'Magento\GroupedImportExport\Model\Import\Product\Type\Grouped', [ 'attrSetColFac' => $this->setCollectionFactory, 'prodAttrColFac' => $this->attrCollectionFactory, + 'resource' => $this->resource, 'params' => $this->params, 'links' => $this->links ] -- GitLab From 06173db95c9b2c1f8ed41dcd4ed85b36f2f824c2 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Thu, 28 May 2015 15:11:13 +0300 Subject: [PATCH 197/396] MAGNIMEX-183: Import advanced prices - validation fix --- .../Model/Import/AdvancedPricing.php | 76 +++++++++++++------ .../Import/AdvancedPricing/Validator.php | 2 + .../AdvancedPricing/Validator/GroupPrice.php | 36 ++++++--- .../AdvancedPricing/Validator/TierPrice.php | 27 +++---- .../AdvancedPricing/Validator/Website.php | 73 ++++++++++++++++++ 5 files changed, 165 insertions(+), 49 deletions(-) create mode 100644 app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index bca7f9c51b1..168cf3e6de2 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -10,10 +10,10 @@ use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as Va class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity { - const VALUE_ALL = 'all'; - const VALUE_ALL_GROUPS = 'ALL GROUPS'; + const VALUE_ALL_WEBSITES = 'All Websites'; + const COL_SKU = 'sku'; const COL_TIER_PRICE_WEBSITE = 'tier_price_website'; @@ -42,7 +42,6 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract protected $_messageTemplates = [ ValidatorInterface::ERROR_INVALID_WEBSITE => 'Invalid value in Website column (website does not exists?)', ValidatorInterface::ERROR_SKU_IS_EMPTY => 'SKU is empty', - ValidatorInterface::ERROR_NO_DEFAULT_ROW => 'Default values row does not exists', ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE => 'Product with specified SKU not found', ValidatorInterface::ERROR_INVALID_TIER_PRICE_QTY => 'Tier Price data price or quantity value is invalid', ValidatorInterface::ERROR_INVALID_TIER_PRICE_SITE => 'Tier Price data website is invalid', @@ -51,33 +50,58 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract ValidatorInterface::ERROR_INVALID_GROUP_PRICE_SITE => 'Group Price data website is invalid', ValidatorInterface::ERROR_INVALID_GROUP_PRICE_GROUP => 'Group Price customer group ID is invalid', ValidatorInterface::ERROR_GROUP_PRICE_DATA_INCOMPLETE => 'Group Price data is incomplete', - ValidatorInterface::ERROR_INVALID_WEBSITE => 'Website data is invalid' ]; - /** @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory */ + /** + * @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory + */ protected $_resourceFactory; - /** @var \Magento\Catalog\Helper\Data */ + /** + * @var \Magento\Catalog\Helper\Data + */ protected $_catalogData; - /** @var \Magento\Catalog\Model\Product */ + /** + * @var \Magento\Catalog\Model\Product + */ protected $_productModel; - /** @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver */ + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver + */ protected $_storeResolver; - /** @var ImportProduct */ + /** + * @var ImportProduct + */ protected $_importProduct; - /** @var AdvancedPricing\Validator */ + /** + * @var AdvancedPricing\Validator + */ protected $_validator; - /** @var array */ + /** + * @var array + */ protected $_cachedSkuToDelete; - /** @var array */ + /** + * @var array + */ protected $_oldSkus; + /** + * @var AdvancedPricing\Validator\Website + */ + protected $websiteValidator; + + /** + * @var AdvancedPricing\Validator\GroupPrice + */ + protected $groupPriceValidator; + public function __construct( \Magento\Framework\Json\Helper\Data $jsonHelper, \Magento\ImportExport\Helper\Data $importExportData, @@ -89,7 +113,9 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract \Magento\Catalog\Helper\Data $catalogData, \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver, ImportProduct $importProduct, - AdvancedPricing\Validator $validator + AdvancedPricing\Validator $validator, + AdvancedPricing\Validator\Website $websiteValidator, + AdvancedPricing\Validator\GroupPrice $groupPriceValidator ) { $this->jsonHelper = $jsonHelper; @@ -104,6 +130,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $this->_importProduct = $importProduct; $this->_validator = $validator; $this->_oldSkus = $this->retrieveOldSkus(); + $this->websiteValidator = $websiteValidator; + $this->groupPriceValidator = $groupPriceValidator; } /** @@ -182,23 +210,27 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $groupPrices = []; foreach ($bunch as $rowNum => $rowData) { if (!$this->validateRow($rowData, $rowNum)) { + $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); continue; } $rowSku = $rowData[self::COL_SKU]; if (!empty($rowData[self::COL_TIER_PRICE_WEBSITE])) { $tierPrices[$rowSku][] = [ 'all_groups' => $rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS, - 'customer_group_id' => $this->getCustomerGroupId($rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP]), + 'customer_group_id' => $this->getCustomerGroupId( + $rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] + ), 'qty' => $rowData[self::COL_TIER_PRICE_QTY], 'value' => $rowData[self::COL_TIER_PRICE], 'website_id' => $this->getWebsiteId($rowData[self::COL_TIER_PRICE_WEBSITE]) - ]; } if (!empty($rowData[self::COL_GROUP_PRICE_WEBSITE])) { $groupPrices[$rowSku][] = [ 'all_groups' => $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS, - 'customer_group_id' => $this->getCustomerGroupId($rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP]), + 'customer_group_id' => $this->getCustomerGroupId( + $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] + ), 'value' => $rowData[self::COL_GROUP_PRICE], 'website_id' => $this->getWebSiteId($rowData[self::COL_GROUP_PRICE_WEBSITE]) ]; @@ -219,10 +251,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract while ($bunch = $this->_dataSourceModel->getNextBunch()) { foreach ($bunch as $rowNum => $rowData) { if (!$this->validateRow($rowData, $rowNum)) { - continue; - } else { $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); - return false; + continue; } $rowSku = $rowData[self::COL_SKU]; $listSku[] = $rowSku; @@ -241,7 +271,6 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected function replaceAdvancedPricing() { - //todo implement replace } /** @@ -308,7 +337,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected function getWebSiteId($websiteCode) { - $result = $websiteCode == self::VALUE_ALL || + $result = $websiteCode == $this->websiteValidator->getAllWebsitesValue() || $this->_catalogData->isPriceGlobal() ? 0 : $this->_storeResolver->getWebsiteCodeToId($websiteCode); return $result; } @@ -321,9 +350,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected function getCustomerGroupId($customerGroup) { - return $customerGroup == self::VALUE_ALL_GROUPS - ? \Magento\Customer\Model\Group::CUST_GROUP_ALL - : $customerGroup; + $customerGroups = $this->groupPriceValidator->getCustomerGroups(); + return $customerGroup == self::VALUE_ALL_GROUPS ? 0 : $customerGroups[$customerGroup]; } /** diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php index 42af865fbd6..ad05fa7957d 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php @@ -21,6 +21,8 @@ class Validator extends AbstractValidator implements RowValidatorInterface } /** + * Check value is valid + * * @param array $value * @return bool */ diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php index e258ccf6a4b..6fc87c5e83c 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php @@ -38,7 +38,6 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid parent::__construct($groupRepository, $searchCriteriaBuilder); } - /** * Call parent init() * @@ -46,7 +45,9 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid */ public function init() { - return parent::init(); + foreach ($this->groupRepository->getList($this->searchCriteriaBuilder->create())->getItems() as $group) { + $this->customerGroups[$group->getCode()] = $group->getId(); + } } /** @@ -58,18 +59,16 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid public function isValid($value) { $this->_clearMessages(); - if ($this->_isValidValueAndLength($value)) { + if (!$this->customerGroups) { + $this->init(); + } + if ($this->isValidValueAndLength($value)) { if (!isset($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE]) || !isset($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]) - || $this->_hasEmptyColumns($value)) { + || $this->hasEmptyColumns($value)) { $this->_addMessages([self::ERROR_GROUP_PRICE_DATA_INCOMPLETE]); return false; - } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE] != self::VALUE_ALL - && !$this->storeResolver->getWebsiteCodeToId($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE]) - ) { - $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_SITE]); - return false; - } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] != self::VALUE_ALL + } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] != AdvancedPricing::VALUE_ALL_GROUPS && !isset($this->customerGroups[$value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]]) ) { $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_GROUP]); @@ -79,13 +78,26 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid return true; } + /** + * Get existing customers groups + * + * @return array + */ + public function getCustomerGroups() + { + if (!$this->customerGroups) { + $this->init(); + } + return $this->customerGroups; + } + /** * Check if at list one value and length are valid * * @param array $value * @return bool */ - protected function _isValidValueAndLength(array $value) + protected function isValidValueAndLength(array $value) { $isValid = false; foreach ($this->_groupPriceColumns as $column) { @@ -102,7 +114,7 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid * @param array $value * @return bool */ - protected function _hasEmptyColumns(array $value) + protected function hasEmptyColumns(array $value) { $hasEmptyValues = false; foreach ($this->_groupPriceColumns as $column) { diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php index cde6d712bbc..2ecc1c232e1 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php @@ -46,33 +46,34 @@ class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valida */ public function init() { - return parent::init(); + foreach ($this->groupRepository->getList($this->searchCriteriaBuilder->create())->getItems() as $group) { + $this->customerGroups[$group->getCode()] = $group->getId(); + } } /** + * Validation + * * @param mixed $value * @return bool */ public function isValid($value) { $this->_clearMessages(); - if ($this->_isValidValueAndLength($value)) { + if (!$this->customerGroups) { + $this->init(); + } + if ($this->isValidValueAndLength($value)) { if (!isset($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE]) || !isset($value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP]) || !isset($value[AdvancedPricing::COL_TIER_PRICE_QTY]) || !isset($value[AdvancedPricing::COL_TIER_PRICE]) - || $this->_hasEmptyColumns($value) + || $this->hasEmptyColumns($value) ) { $this->_addMessages([self::ERROR_TIER_DATA_INCOMPLETE]); return false; - } elseif ($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE] != self::VALUE_ALL - && !$this->storeResolver->getWebsiteCodeToId($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE]) - ) { - $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_SITE]); - return false; - } elseif ($value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP] != self::VALUE_ALL && !isset( - $this->customerGroups[$value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP]] - ) + } elseif ($value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP] != AdvancedPricing::VALUE_ALL_GROUPS + && !isset($this->customerGroups[$value[AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP]]) ) { $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_GROUP]); return false; @@ -90,7 +91,7 @@ class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valida * @param array $value * @return bool */ - protected function _isValidValueAndLength(array $value) + protected function isValidValueAndLength(array $value) { $isValid = false; foreach ($this->_tierPriceColumns as $column) { @@ -107,7 +108,7 @@ class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valida * @param array $value * @return bool */ - protected function _hasEmptyColumns(array $value) + protected function hasEmptyColumns(array $value) { $hasEmptyValues = false; foreach ($this->_tierPriceColumns as $column) { diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php new file mode 100644 index 00000000000..ff48ba2d2d3 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php @@ -0,0 +1,73 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator; + +use Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; +use \Magento\Framework\Validator\AbstractValidator; +use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface; + +class Website extends AbstractValidator implements RowValidatorInterface +{ + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver + */ + protected $storeResolver; + + /** + * @param \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver + */ + public function __construct( + \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver, + \Magento\Store\Model\WebSite $webSiteModel + ) + { + $this->storeResolver = $storeResolver; + $this->webSiteModel = $webSiteModel; + } + + /** + * Initialize validator + * + * @return $this + */ + public function init() + { + return $this; + } + + /** + * Validate value + * + * @param mixed $value + * @return bool + */ + public function isValid($value) + { + $this->_clearMessages(); + if ($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE] != $this->getAllWebsitesValue() && + $value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE] != $this->getAllWebsitesValue()) { + if ((!empty($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE]) + && !$this->storeResolver->getWebsiteCodeToId($value[AdvancedPricing::COL_TIER_PRICE_WEBSITE])) + || ((!empty($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE])) + && !$this->storeResolver->getWebsiteCodeToId($value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE])) + ) { + $this->_addMessages([self::ERROR_INVALID_WEBSITE]); + return false; + } + } + return true; + } + + /** + * Get all websites value with currency code + * + * @return string + */ + public function getAllWebsitesValue() + { + return AdvancedPricing::VALUE_ALL_WEBSITES . ' ['.$this->webSiteModel->getBaseCurrency()->getCurrencyCode().']'; + } +} \ No newline at end of file -- GitLab From 91d5b5cad340ebccee1d3af77abf1204607edb75 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Thu, 28 May 2015 17:20:54 +0300 Subject: [PATCH 198/396] MAGNIMEX-183: Import advanced prices - fix for schedule validator - docBlock fix - composer fix --- .../Model/Import/AdvancedPricing.php | 45 ++++++++++++------- .../Indexer/Product/Price/Plugin/Import.php | 16 ++++--- .../AdvancedPricingImportExport/composer.json | 12 ++--- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 168cf3e6de2..bb00d8ab206 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -102,6 +102,21 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected $groupPriceValidator; + /** + * @param \Magento\Framework\Json\Helper\Data $jsonHelper + * @param \Magento\ImportExport\Helper\Data $importExportData + * @param \Magento\ImportExport\Model\Resource\Helper $resourceHelper + * @param \Magento\ImportExport\Model\Resource\Import\Data $importData + * @param \Magento\Framework\App\Resource $resource + * @param \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory $resourceFactory + * @param \Magento\Catalog\Model\Product $productModel + * @param \Magento\Catalog\Helper\Data $catalogData + * @param ImportProduct\StoreResolver $storeResolver + * @param ImportProduct $importProduct + * @param AdvancedPricing\Validator $validator + * @param AdvancedPricing\Validator\Website $websiteValidator + * @param AdvancedPricing\Validator\GroupPrice $groupPriceValidator + */ public function __construct( \Magento\Framework\Json\Helper\Data $jsonHelper, \Magento\ImportExport\Helper\Data $importExportData, @@ -308,22 +323,20 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected function deleteProductTierAndGroupPrices(array $listSku, $tableName) { - if ($tableName) { - if ($listSku) { - if(!$this->_cachedSkuToDelete) { - $this->_cachedSkuToDelete = $this->_connection->fetchCol($this->_connection->select() - ->from($this->_connection->getTableName('catalog_product_entity'), 'entity_id') - ->where('sku IN (?)', $listSku)); - } - if($this->_cachedSkuToDelete) { - $this->_connection->delete( - $tableName, - $this->_connection->quoteInto('entity_id IN (?)', $this->_cachedSkuToDelete) - ); - } else { - $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, 0); - return false; - } + if ($tableName && $listSku) { + if(!$this->_cachedSkuToDelete) { + $this->_cachedSkuToDelete = $this->_connection->fetchCol($this->_connection->select() + ->from($this->_connection->getTableName('catalog_product_entity'), 'entity_id') + ->where('sku IN (?)', $listSku)); + } + if($this->_cachedSkuToDelete) { + $this->_connection->delete( + $tableName, + $this->_connection->quoteInto('entity_id IN (?)', $this->_cachedSkuToDelete) + ); + } else { + $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, 0); + return false; } } return $this; diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php index 37a2e4878ca..9c6335d483b 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php @@ -12,7 +12,9 @@ class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\Abstrac */ public function afterSaveAdvancedPricing() { - $this->invalidateIndexer(); + if (!$this->getPriceIndexer()->isScheduled()) { + $this->invalidateIndexer(); + } } /** @@ -20,14 +22,18 @@ class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\Abstrac */ public function afterDeleteAdvancedPricing() { - $this->invalidateIndexer(); + if (!$this->getPriceIndexer()->isScheduled()) { + $this->invalidateIndexer(); + } } /** - * After replace handler + * Get price indexer + * + * @return \Magento\Indexer\Model\IndexerInterface */ - public function afterReplaceAdvancedPricing() + protected function getPriceIndexer() { - $this->invalidateIndexer(); + return $this->indexerRegistry->get(\Magento\Catalog\Model\Indexer\Product\Price\Processor::INDEXER_ID); } } diff --git a/app/code/Magento/AdvancedPricingImportExport/composer.json b/app/code/Magento/AdvancedPricingImportExport/composer.json index fb075809d50..8f3a911a466 100644 --- a/app/code/Magento/AdvancedPricingImportExport/composer.json +++ b/app/code/Magento/AdvancedPricingImportExport/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta7", - "magento/module-import-export": "0.74.0-beta7", - "magento/module-catalog-import-export": "0.74.0-beta7", - "magento/module-eav": "0.74.0-beta7", - "magento/framework": "0.74.0-beta7", + "magento/module-catalog": "0.74.0-beta10", + "magento/module-import-export": "0.74.0-beta10", + "magento/module-catalog-import-export": "0.74.0-beta10", + "magento/module-eav": "0.74.0-beta10", + "magento/framework": "0.74.0-beta10", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta7", + "version": "0.74.0-beta10", "license": [ "OSL-3.0", "AFL-3.0" -- GitLab From 95f4be9e35faeffc5d4b44b6a30d1ce6847fecb8 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Fri, 29 May 2015 12:31:45 +0300 Subject: [PATCH 199/396] MAGNIMEX-183: Import advanced pricing - delete validation hotfix; --- .../Model/Import/AdvancedPricing.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index bb00d8ab206..c932b3168ab 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -174,7 +174,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } $this->_validatedRows[$rowNum] = true; if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { - if (false) { + if (!isset($this->_oldSkus[$rowData[self::COL_SKU]])) { $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); return false; } -- GitLab From dee4e9d42eada9279d48823ad83ac8b0a7b64a89 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Mon, 25 May 2015 19:29:53 +0300 Subject: [PATCH 200/396] MAGNIMEX-15: export, basic case --- .../Model/Export/Product.php | 200 ++++++++++-------- 1 file changed, 109 insertions(+), 91 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index d009107df13..0fd042b6b94 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -41,6 +41,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity const COL_TYPE = '_type'; + const COL_PRODUCT_WEBSITES = '_product_websites'; + const COL_CATEGORY = '_category'; const COL_ROOT_CATEGORY = '_root_category'; @@ -49,6 +51,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity const COL_VISIBILITY = 'visibility'; + const COL_MEDIA_IMAGE = '_media_image'; + /** * Pairs of attribute set ID-to-name. * @@ -213,6 +217,45 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity */ protected $rowCustomizer; + + /** + * Map between import file fields and system fields/attributes + * + * @var array + */ + protected $_fields_map = [ + 'image' => 'base_image', + 'image_label' => "base_image_label", + 'image' => 'base_image', + 'image_label' => 'base_image_label', + 'thumbnail' => 'thumbnail_image', + 'thumbnail_label' => 'thumbnail_image_label', + self::COL_MEDIA_IMAGE => 'additional_images', + '_media_image_label' => 'additional_image_labels', + Product::COL_STORE => 'store_view_code', + Product::COL_ATTR_SET => 'attribute_set_code', + Product::COL_TYPE => 'product_type', + Product::COL_PRODUCT_WEBSITES => 'product_websites', + 'status' => 'product_online', + 'news_from_date' => 'new_from_date', + 'news_to_date' => 'new_to_date', + 'options_container' => 'display_product_options_in', + 'minimal_price' => 'map_price', + 'msrp' => 'msrp_price', + 'msrp_enabled' => 'map_enabled', + 'special_from_date' => 'special_price_from_date', + 'special_to_date' => 'special_price_to_date', + 'min_qty' => 'out_of_stock_qty', + 'backorders' => 'allow_backorders', + 'min_sale_qty' => 'min_cart_qty', + 'max_sale_qty' => 'max_cart_qty', + 'notify_stock_qty' => 'notify_on_stock_below', + '_related_sku' => 'related_skus', + '_crosssell_sku' => 'crosssell_skus', + '_upsell_sku' => 'upsell_skus', + 'meta_keyword' => 'meta_keywords', + ]; + /** * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate * @param \Magento\Eav\Model\Config $config @@ -370,75 +413,6 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity return $this; } - /** - * Prepare products tier prices - * - * @param int[] $productIds - * @return array - */ - protected function prepareTierPrices(array $productIds) - { - if (empty($productIds)) { - return []; - } - $select = $this->_connection->select()->from( - $this->_resourceModel->getTableName('catalog_product_entity_tier_price') - )->where( - 'entity_id IN(?)', - $productIds - ); - - $rowTierPrices = []; - $stmt = $this->_connection->query($select); - while ($tierRow = $stmt->fetch()) { - $rowTierPrices[$tierRow['entity_id']][] = [ - '_tier_price_customer_group' => $tierRow['all_groups'] - ? self::VALUE_ALL - : $tierRow['customer_group_id'], - '_tier_price_website' => 0 == - $tierRow['website_id'] ? self::VALUE_ALL : $this->_websiteIdToCode[$tierRow['website_id']], - '_tier_price_qty' => $tierRow['qty'], - '_tier_price_price' => $tierRow['value'], - ]; - } - - return $rowTierPrices; - } - - /** - * Prepare products group prices - * - * @param int[] $productIds - * @return array - */ - protected function prepareGroupPrices(array $productIds) - { - if (empty($productIds)) { - return []; - } - $select = $this->_connection->select()->from( - $this->_resourceModel->getTableName('catalog_product_entity_group_price') - )->where( - 'entity_id IN(?)', - $productIds - ); - - $rowGroupPrices = []; - $statement = $this->_connection->query($select); - while ($groupRow = $statement->fetch()) { - $rowGroupPrices[$groupRow['entity_id']][] = [ - '_group_price_customer_group' => $groupRow['all_groups'] - ? self::VALUE_ALL - : $groupRow['customer_group_id'], - '_group_price_website' => 0 == - $groupRow['website_id'] ? self::VALUE_ALL : $this->_websiteIdToCode[$groupRow['website_id']], - '_group_price_price' => $groupRow['value'], - ]; - } - - return $rowGroupPrices; - } - /** * Prepare products media gallery * @@ -599,14 +573,14 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity if (!isset($rowCategories[$productId])) { return false; } - - $categoryId = array_shift($rowCategories[$productId]); - if ($categoryId) { - $dataRow[self::COL_ROOT_CATEGORY] = $this->_rootCategories[$categoryId]; + $categories = array(); + foreach ($rowCategories[$productId] as $categoryId) { if (isset($this->_categories[$categoryId])) { - $dataRow[self::COL_CATEGORY] = $this->_categories[$categoryId]; + $categories[] = $this->_rootCategories[$categoryId] . '/' . $this->_categories[$categoryId]; } } + $dataRow[self::COL_CATEGORY] = implode('|', $categories); + unset($rowCategories[$productId]); return true; } @@ -616,7 +590,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity */ public function _getHeaderColumns() { - return $this->_headerColumns; + return $this->_customHeadersMapping($this->_headerColumns); } /** @@ -650,7 +624,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity self::COL_ATTR_SET, self::COL_TYPE, self::COL_CATEGORY, - self::COL_ROOT_CATEGORY, + //self::COL_ROOT_CATEGORY, '_product_websites', ], $this->_getExportAttrCodes(), @@ -767,7 +741,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity $writer->setHeaderCols($this->_getHeaderColumns()); } foreach ($exportData as $dataRow) { - $writer->writeRow($dataRow); + $writer->writeRow($this->_customFieldsMapping($dataRow)); } if ($entityCollection->getCurPage() >= $entityCollection->getLastPageNumber()) { break; @@ -776,6 +750,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity return $writer->getContents(); } + // protected function combineComplexData () + /** * Get export data for collection * @@ -906,8 +882,6 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity $data['rowWebsites'] = $rowWebsites; $data['rowCategories'] = $rowCategories; $data['mediaGalery'] = $this->getMediaGallery($productIds); - $data['rowTierPrices'] = $this->prepareTierPrices($productIds); - $data['rowGroupPrices'] = $this->prepareGroupPrices($productIds); $data['linksRows'] = $this->prepareLinks($productIds); $data['customOptionsData'] = $this->getCustomOptionsData($productIds); @@ -982,24 +956,30 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity unset($dataRow['product_id']); unset($dataRow['store_id']); - - while (true) { +$tmp = 0; + while (true && ($tmp <= 1000)) { + $tmp++; if (Store::DEFAULT_STORE_ID == $storeId) { unset($dataRow[self::COL_STORE]); $this->updateDataWithCategoryColumns($dataRow, $multirawData['rowCategories'], $productId); if (!empty($multirawData['rowWebsites'][$productId])) { - $dataRow['_product_websites'] = $this->_websiteIdToCode[ - array_shift($multirawData['rowWebsites'][$productId]) - ]; - } - if (!empty($multirawData['rowTierPrices'][$productId])) { - $dataRow = array_merge($dataRow, array_shift($multirawData['rowTierPrices'][$productId])); - } - if (!empty($multirawData['rowGroupPrices'][$productId])) { - $dataRow = array_merge($dataRow, array_shift($multirawData['rowGroupPrices'][$productId])); + $websiteCodes = array(); + foreach ($multirawData['rowWebsites'][$productId] as $productWebsite) { + $websiteCodes[] = $this->_websiteIdToCode[$productWebsite]; + } + $dataRow['_product_websites'] = implode(',', $websiteCodes); + $multirawData['rowWebsites'][$productId] = array(); } if (!empty($multirawData['mediaGalery'][$productId])) { - $dataRow = array_merge($dataRow, array_shift($multirawData['mediaGalery'][$productId])); + $additionalImages = array(); + $additionalImageLabels = array(); + foreach ($multirawData['mediaGalery'][$productId] as $mediaItem) { + $additionalImages[] = $mediaItem['_media_image']; + $additionalImageLabels[] = $mediaItem['_media_label']; + } + $dataRow['additional_images'] = implode(',', $additionalImages); + $dataRow['additional_image_labels'] = implode(',', $additionalImageLabels); + $multirawData['mediaGalery'][$productId] = array(); } foreach ($this->_linkTypeProvider->getLinkTypes() as $linkTypeName => $linkId) { if (!empty($multirawData['linksRows'][$productId][$linkId])) { @@ -1046,10 +1026,48 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity $result[] = $dataRow; $dataRow = []; } + if ($tmp>999) { + echo 'infinite loop';die(); + } return $result; } + /** + * Custom fields mapping for changed purposes of fields and field names + * + * @param array $rowData + * + * @return array + */ + private function _customFieldsMapping($rowData) + { + foreach ($this->_fields_map as $system_field_name => $file_field_name) { + if (isset($rowData[$system_field_name])) { + $rowData[$file_field_name] = $rowData[$system_field_name]; + unset($rowData[$system_field_name]); + } + } + return $rowData; + } + + /** + * Custom headers mapping for changed field names + * + * @param array $rowData + * + * @return array + */ + private function _customHeadersMapping($rowData) + { + foreach ($rowData as $key => $field_name) { + if (isset($this->_fields_map[$field_name])) { + $rowData[$key] = $this->_fields_map[$field_name]; + } + } + return $rowData; + } + /** * @param int[] $productIds * @return array -- GitLab From 54128fe72e7ba766a7777648801d8d6c6b28edf2 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Tue, 26 May 2015 13:13:26 +0300 Subject: [PATCH 201/396] MAGNIMEX-15: remove useless fields --- .../Model/Export/Product.php | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 0fd042b6b94..32a0bc28fdd 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -235,6 +235,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity Product::COL_STORE => 'store_view_code', Product::COL_ATTR_SET => 'attribute_set_code', Product::COL_TYPE => 'product_type', + Product::COL_CATEGORY => 'categories', Product::COL_PRODUCT_WEBSITES => 'product_websites', 'status' => 'product_online', 'news_from_date' => 'new_from_date', @@ -632,15 +633,10 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity [], [ '_related_sku', - '_related_position', '_crosssell_sku', - '_crosssell_position', '_upsell_sku', - '_upsell_position' ], - ['_tier_price_website', '_tier_price_customer_group', '_tier_price_qty', '_tier_price_price'], - ['_group_price_website', '_group_price_customer_group', '_group_price_price'], - ['_media_attribute_id', '_media_image', '_media_label', '_media_position', '_media_is_disabled'] + ['additional_images', 'additional_image_labels'] ); // have we merge custom options columns if ($customOptionsData) { @@ -985,13 +981,18 @@ $tmp = 0; if (!empty($multirawData['linksRows'][$productId][$linkId])) { $colPrefix = '_' . $linkTypeName . '_'; - $linkData = array_shift($multirawData['linksRows'][$productId][$linkId]); - $dataRow[$colPrefix . 'position'] = $linkData['position']; - $dataRow[$colPrefix . 'sku'] = $linkData['sku']; - - if ($linkData['default_qty'] !== null) { - $dataRow[$colPrefix . 'default_qty'] = $linkData['default_qty']; + $associations = array(); + foreach ($multirawData['linksRows'][$productId][$linkId] as $linkData) { + if ($linkData['default_qty'] !== null) { + $skuItem = $linkData['sku'] . '=' . $linkData['default_qty']; + } else { + $skuItem = $linkData['sku']; + } + $associations[$skuItem] = $linkData['position']; } + $multirawData['linksRows'][$productId][$linkId] = array(); + sort($associations); + $dataRow[$colPrefix . 'sku'] = implode(',', array_keys($associations)); } } $dataRow = $this->rowCustomizer->addData($dataRow, $productId); -- GitLab From 0d7d15dbb539bdff7ebeff8c257cd2b4c3abf681 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Tue, 26 May 2015 17:25:27 +0300 Subject: [PATCH 202/396] MAGNIMEX-15: assosiated products --- app/code/Magento/CatalogImportExport/Model/Export/Product.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 32a0bc28fdd..513e6c4c311 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -836,6 +836,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity $data[$itemId][$storeId][self::COL_STORE] = $storeCode; $data[$itemId][$storeId][self::COL_ATTR_SET] = $this->_attrSetIdToName[$attrSetId]; $data[$itemId][$storeId][self::COL_TYPE] = $item->getTypeId(); + $data[$itemId][$storeId][self::COL_SKU] = $item->getSku(); } $data[$itemId][$storeId]['store_id'] = $storeId; $data[$itemId][$storeId]['product_id'] = $itemId; @@ -991,7 +992,7 @@ $tmp = 0; $associations[$skuItem] = $linkData['position']; } $multirawData['linksRows'][$productId][$linkId] = array(); - sort($associations); + asort($associations); $dataRow[$colPrefix . 'sku'] = implode(',', array_keys($associations)); } } @@ -1016,7 +1017,6 @@ $tmp = 0; break; } elseif ($storeId != Store::DEFAULT_STORE_ID) { $dataRow[self::COL_STORE] = $this->_storeIdToCode[$storeId]; - $dataRow[self::COL_SKU] = null; $dataRow[self::COL_ATTR_SET] = null; $dataRow[self::COL_TYPE] = null; if (isset($productData[Store::DEFAULT_STORE_ID][self::COL_VISIBILITY])) { -- GitLab From 566e55594d3baaeea1765775afc92997886a4487 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Wed, 27 May 2015 11:09:30 +0300 Subject: [PATCH 203/396] MAGNIMEX-15: custom options --- .../Model/Export/Product.php | 336 +++++++++--------- 1 file changed, 175 insertions(+), 161 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 513e6c4c311..59bd50b22e3 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -6,6 +6,7 @@ namespace Magento\CatalogImportExport\Model\Export; use \Magento\Store\Model\Store; +use \Magento\CatalogImportExport\Model\Import\Product as ImportProduct; /** * Export entity product model @@ -53,6 +54,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity const COL_MEDIA_IMAGE = '_media_image'; + const COL_ADDITIONAL_ATTRIBUTES = 'additional_attributes'; + /** * Pairs of attribute set ID-to-name. * @@ -80,9 +83,6 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity * @var string[] */ protected $_indexValueAttributes = [ - 'status', - 'tax_class_id', - 'visibility', 'gift_message_available', 'custom_design', ]; @@ -217,7 +217,6 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity */ protected $rowCustomizer; - /** * Map between import file fields and system fields/attributes * @@ -251,10 +250,38 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity 'min_sale_qty' => 'min_cart_qty', 'max_sale_qty' => 'max_cart_qty', 'notify_stock_qty' => 'notify_on_stock_below', - '_related_sku' => 'related_skus', - '_crosssell_sku' => 'crosssell_skus', - '_upsell_sku' => 'upsell_skus', 'meta_keyword' => 'meta_keywords', + 'tax_class_id' => 'tax_class_name', + ]; + + /** + * Attributes codes which are appropriate for export and not the part of additional_attributes. + * + * @var array + */ + protected $_exportMainAttrCodes = [ + self::COL_SKU, + 'name', + 'description', + 'short_description', + 'weight', + 'product_online', + 'tax_class_name', + 'visibility', + 'price', + 'special_price', + 'special_price_from_date', + 'special_price_to_date', + 'url_key', + 'meta_title', + 'meta_keywords', + 'meta_description', + 'base_image', + 'base_image_label', + 'small_image', + 'small_image_label', + 'thumbnail_image', + 'thumbnail_image_label' ]; /** @@ -576,11 +603,13 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity } $categories = array(); foreach ($rowCategories[$productId] as $categoryId) { + $categoryPath = $this->_rootCategories[$categoryId]; if (isset($this->_categories[$categoryId])) { - $categories[] = $this->_rootCategories[$categoryId] . '/' . $this->_categories[$categoryId]; + $categoryPath .= '/' . $this->_categories[$categoryId]; } + $categories[] = $categoryPath; } - $dataRow[self::COL_CATEGORY] = implode('|', $categories); + $dataRow[self::COL_CATEGORY] = implode(ImportProduct::PSEUDO_MULTI_LINE_SEPARATOR, $categories); unset($rowCategories[$productId]); return true; @@ -605,18 +634,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity { if (!$this->_headerColumns) { $customOptCols = [ - '_custom_option_store', - '_custom_option_type', - '_custom_option_title', - '_custom_option_is_required', - '_custom_option_price', - '_custom_option_sku', - '_custom_option_max_characters', - '_custom_option_sort_order', - '_custom_option_row_title', - '_custom_option_row_price', - '_custom_option_row_sku', - '_custom_option_row_sort', + 'custom_options', ]; $this->_headerColumns = array_merge( [ @@ -625,16 +643,16 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity self::COL_ATTR_SET, self::COL_TYPE, self::COL_CATEGORY, - //self::COL_ROOT_CATEGORY, '_product_websites', ], - $this->_getExportAttrCodes(), + $this->_getExportMainAttrCodes(), + [self::COL_ADDITIONAL_ATTRIBUTES], reset($stockItemRows) ? array_keys(end($stockItemRows)) : [], [], [ - '_related_sku', - '_crosssell_sku', - '_upsell_sku', + 'related_skus', + 'crosssell_skus', + 'upsell_skus', ], ['additional_images', 'additional_image_labels'] ); @@ -645,6 +663,16 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity } } + /** + * Get attributes codes which are appropriate for export and not the part of additional_attributes. + * + * @return array + */ + protected function _getExportMainAttrCodes() + { + return $this->_exportMainAttrCodes; + } + /** * {@inheritdoc} */ @@ -746,8 +774,6 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity return $writer->getContents(); } - // protected function combineComplexData () - /** * Get export data for collection * @@ -805,6 +831,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity * @var \Magento\Catalog\Model\Product $item */ foreach ($collection as $itemId => $item) { + $additionalAttributes = array(); foreach ($this->_getExportAttrCodes() as $code) { $attrValue = $item->getData($code); if (!$this->isValidAttributeValue($code, $attrValue)) { @@ -814,30 +841,43 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity if (isset($this->_attributeValues[$code][$attrValue]) && !empty($this->_attributeValues[$code])) { $attrValue = $this->_attributeValues[$code][$attrValue]; } + $fieldName = isset($this->_fields_map[$code]) ? $this->_fields_map[$code] : $code; if ($storeId != Store::DEFAULT_STORE_ID - && isset($data[$itemId][Store::DEFAULT_STORE_ID][$code]) - && $data[$itemId][Store::DEFAULT_STORE_ID][$code] == $attrValue + && isset($data[$itemId][Store::DEFAULT_STORE_ID][$fieldName]) + && $data[$itemId][Store::DEFAULT_STORE_ID][$fieldName] == $attrValue ) { continue; } if ($this->_attributeTypes[$code] !== 'multiselect') { if (is_scalar($attrValue)) { - $data[$itemId][$storeId][$code] = $attrValue; + if (!in_array($fieldName, $this->_getExportMainAttrCodes())) { + $additionalAttributes[$fieldName] = $fieldName . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $attrValue; + } + $data[$itemId][$storeId][$fieldName] = $attrValue; + } else { + $this->collectMultiselectValues($item, $code, $storeId); } - } else { - $this->collectMultiselectValues($item, $code, $storeId); } } + if (!empty($data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES])) { + $data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalAttributes); + foreach ($additionalAttributes as $fieldName => $value) { + unset($data[$itemId][$storeId][$fieldName]); + } + } else { + unset($data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES]); + } + if (!empty($data[$itemId][$storeId]) || $this->hasMultiselectData($item, $storeId)) { $attrSetId = $item->getAttributeSetId(); $data[$itemId][$storeId][self::COL_STORE] = $storeCode; $data[$itemId][$storeId][self::COL_ATTR_SET] = $this->_attrSetIdToName[$attrSetId]; $data[$itemId][$storeId][self::COL_TYPE] = $item->getTypeId(); - $data[$itemId][$storeId][self::COL_SKU] = $item->getSku(); } + $data[$itemId][$storeId][self::COL_SKU] = $item->getSku(); $data[$itemId][$storeId]['store_id'] = $storeId; $data[$itemId][$storeId]['product_id'] = $itemId; } @@ -905,7 +945,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity protected function collectMultiselectValues($item, $attrCode, $storeId) { $attrValue = $item->getData($attrCode); - $optionIds = explode(',', $attrValue); + $optionIds = explode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $attrValue); $options = array_intersect_key( $this->_attributeValues[$attrCode], array_flip($optionIds) @@ -940,96 +980,92 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity /** * @param array $dataRow - * @param array $multirawData + * @param array $multiRawData * @return array * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ - protected function addMultirowData($dataRow, $multirawData) + protected function addMultirowData($dataRow, $multiRawData) { $result = []; $productId = $dataRow['product_id']; $storeId = $dataRow['store_id']; + $sku = $dataRow[self::COL_SKU]; unset($dataRow['product_id']); unset($dataRow['store_id']); -$tmp = 0; - while (true && ($tmp <= 1000)) { - $tmp++; - if (Store::DEFAULT_STORE_ID == $storeId) { - unset($dataRow[self::COL_STORE]); - $this->updateDataWithCategoryColumns($dataRow, $multirawData['rowCategories'], $productId); - if (!empty($multirawData['rowWebsites'][$productId])) { - $websiteCodes = array(); - foreach ($multirawData['rowWebsites'][$productId] as $productWebsite) { - $websiteCodes[] = $this->_websiteIdToCode[$productWebsite]; - } - $dataRow['_product_websites'] = implode(',', $websiteCodes); - $multirawData['rowWebsites'][$productId] = array(); + unset($dataRow[self::COL_SKU]); + + if (Store::DEFAULT_STORE_ID == $storeId) { + unset($dataRow[self::COL_STORE]); + $this->updateDataWithCategoryColumns($dataRow, $multiRawData['rowCategories'], $productId); + if (!empty($multiRawData['rowWebsites'][$productId])) { + $websiteCodes = array(); + foreach ($multiRawData['rowWebsites'][$productId] as $productWebsite) { + $websiteCodes[] = $this->_websiteIdToCode[$productWebsite]; } - if (!empty($multirawData['mediaGalery'][$productId])) { - $additionalImages = array(); - $additionalImageLabels = array(); - foreach ($multirawData['mediaGalery'][$productId] as $mediaItem) { - $additionalImages[] = $mediaItem['_media_image']; - $additionalImageLabels[] = $mediaItem['_media_label']; - } - $dataRow['additional_images'] = implode(',', $additionalImages); - $dataRow['additional_image_labels'] = implode(',', $additionalImageLabels); - $multirawData['mediaGalery'][$productId] = array(); + $dataRow['_product_websites'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $websiteCodes); + $multiRawData['rowWebsites'][$productId] = array(); + } + if (!empty($multiRawData['mediaGalery'][$productId])) { + $additionalImages = array(); + $additionalImageLabels = array(); + foreach ($multiRawData['mediaGalery'][$productId] as $mediaItem) { + $additionalImages[] = $mediaItem['_media_image']; + $additionalImageLabels[] = $mediaItem['_media_label']; } - foreach ($this->_linkTypeProvider->getLinkTypes() as $linkTypeName => $linkId) { - if (!empty($multirawData['linksRows'][$productId][$linkId])) { - $colPrefix = '_' . $linkTypeName . '_'; - - $associations = array(); - foreach ($multirawData['linksRows'][$productId][$linkId] as $linkData) { - if ($linkData['default_qty'] !== null) { - $skuItem = $linkData['sku'] . '=' . $linkData['default_qty']; - } else { - $skuItem = $linkData['sku']; - } - $associations[$skuItem] = $linkData['position']; + $dataRow['additional_images'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImages); + $dataRow['additional_image_labels'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageLabels); + $multiRawData['mediaGalery'][$productId] = array(); + } + foreach ($this->_linkTypeProvider->getLinkTypes() as $linkTypeName => $linkId) { + if (!empty($multiRawData['linksRows'][$productId][$linkId])) { + $colPrefix = $linkTypeName . '_'; + + $associations = array(); + foreach ($multiRawData['linksRows'][$productId][$linkId] as $linkData) { + if ($linkData['default_qty'] !== null) { + $skuItem = $linkData['sku'] . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $linkData['default_qty']; + } else { + $skuItem = $linkData['sku']; } - $multirawData['linksRows'][$productId][$linkId] = array(); - asort($associations); - $dataRow[$colPrefix . 'sku'] = implode(',', array_keys($associations)); + $associations[$skuItem] = $linkData['position']; } - } - $dataRow = $this->rowCustomizer->addData($dataRow, $productId); - - if (!empty($multirawData['customOptionsData'][$productId])) { - $dataRow = array_merge($dataRow, array_shift($multirawData['customOptionsData'][$productId])); + $multiRawData['linksRows'][$productId][$linkId] = array(); + asort($associations); + $dataRow[$colPrefix . 'skus'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, array_keys($associations)); } } + $dataRow = $this->rowCustomizer->addData($dataRow, $productId); - if (!empty($this->collectedMultiselectsData[$storeId][$productId])) { - foreach (array_keys($this->collectedMultiselectsData[$storeId][$productId]) as $attrKey) { - if (!empty($this->collectedMultiselectsData[$storeId][$productId][$attrKey])) { - $dataRow[$attrKey] = array_shift( - $this->collectedMultiselectsData[$storeId][$productId][$attrKey] - ); - } - } - } + } - if (empty($dataRow)) { - break; - } elseif ($storeId != Store::DEFAULT_STORE_ID) { - $dataRow[self::COL_STORE] = $this->_storeIdToCode[$storeId]; - $dataRow[self::COL_ATTR_SET] = null; - $dataRow[self::COL_TYPE] = null; - if (isset($productData[Store::DEFAULT_STORE_ID][self::COL_VISIBILITY])) { - $dataRow[self::COL_VISIBILITY] = $productData[Store::DEFAULT_STORE_ID][self::COL_VISIBILITY]; + if (!empty($this->collectedMultiselectsData[$storeId][$productId])) { + foreach (array_keys($this->collectedMultiselectsData[$storeId][$productId]) as $attrKey) { + if (!empty($this->collectedMultiselectsData[$storeId][$productId][$attrKey])) { + $dataRow[$attrKey] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $this->collectedMultiselectsData[$storeId][$productId][$attrKey]); } } + } - $result[] = $dataRow; - $dataRow = []; + if (!empty($multiRawData['customOptionsData'][$productId][$storeId])) { + $customOptionsRows = $multiRawData['customOptionsData'][$productId][$storeId]; + $multiRawData['customOptionsData'][$productId][$storeId] = array(); + $customOptions = implode(ImportProduct::PSEUDO_MULTI_LINE_SEPARATOR, $customOptionsRows); + + $dataRow = array_merge($dataRow, array('custom_options' => $customOptions)); } - if ($tmp>999) { - echo 'infinite loop';die(); + + if (empty($dataRow)) { + return $result; + } elseif ($storeId != Store::DEFAULT_STORE_ID) { + $dataRow[self::COL_STORE] = $this->_storeIdToCode[$storeId]; + if (isset($productData[Store::DEFAULT_STORE_ID][self::COL_VISIBILITY])) { + $dataRow[self::COL_VISIBILITY] = $productData[Store::DEFAULT_STORE_ID][self::COL_VISIBILITY]; + } } + $dataRow[self::COL_SKU] = $sku; + $result[] = $dataRow; return $result; } @@ -1069,6 +1105,21 @@ $tmp = 0; return $rowData; } + /** + * @param array $option + * @return string + */ + protected function optionRowToCellString($option) + { + $result = array(); + + foreach ($option as $key => $value) { + $result[] = $key . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $value; + } + + return implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $result); + } + /** * @param int[] $productIds * @return array @@ -1078,10 +1129,15 @@ $tmp = 0; protected function getCustomOptionsData($productIds) { $customOptionsData = []; - $customOptionsDataPre = []; foreach (array_keys($this->_storeIdToCode) as $storeId) { - $options = $this->_optionColFactory->create()->reset()->addTitleToResult( + if (Store::DEFAULT_STORE_ID != $storeId) { + continue; + } + $options = $this->_optionColFactory->create(); + /* @var \Magento\Catalog\Model\Resource\Product\Option\Collection $options*/ + $options->addOrder('sort_order'); + $options->reset()->addOrder('sort_order')->addTitleToResult( $storeId )->addPriceToResult( $storeId @@ -1094,75 +1150,33 @@ $tmp = 0; foreach ($options as $option) { $row = []; $productId = $option['product_id']; - $optionId = $option['option_id']; - - if (Store::DEFAULT_STORE_ID == $storeId) { - $row['_custom_option_type'] = $option['type']; - $row['_custom_option_title'] = $option['title']; - $row['_custom_option_is_required'] = $option['is_require']; - $row['_custom_option_price'] = $option['price'] . ($option['price_type'] == 'percent' ? '%' : ''); - $row['_custom_option_sku'] = $option['sku']; - $row['_custom_option_max_characters'] = $option['max_characters']; - $row['_custom_option_sort_order'] = $option['sort_order']; - } else { - $row['_custom_option_title'] = $option['title']; - } - $values = $option->getValues(); - if ($values) { - $firstValue = array_shift($values); - $priceType = $firstValue['price_type'] == 'percent' ? '%' : ''; - - if (Store::DEFAULT_STORE_ID == $storeId) { - $row['_custom_option_row_title'] = $firstValue['title']; - $row['_custom_option_row_price'] = $firstValue['price'] . $priceType; - $row['_custom_option_row_sku'] = $firstValue['sku']; - $row['_custom_option_row_sort'] = $firstValue['sort_order']; - } else { - $row['_custom_option_row_title'] = $firstValue['title']; - } - } - if (Store::DEFAULT_STORE_ID != $storeId) { - $row['_custom_option_store'] = $this->_storeIdToCode[$storeId]; - } - $customOptionsDataPre[$productId][$optionId][] = $row; + $row['name'] = $option['title']; + $row['type'] = $option['type']; + $row['required'] = $option['is_require']; + $row['price'] = $option['price']; + $row['price_type'] = ($option['price_type'] == 'percent') ? $option['price_type'] : 'fixed'; + $row['sku'] = $option['sku']; + + $values = $option->getValues(); if ($values) { foreach ($values as $value) { - $row = []; - $valuePriceType = $value['price_type'] == 'percent' ? '%' : ''; - - if (Store::DEFAULT_STORE_ID == $storeId) { - $row['_custom_option_row_title'] = $value['title']; - $row['_custom_option_row_price'] = $value['price'] . $valuePriceType; - $row['_custom_option_row_sku'] = $value['sku']; - $row['_custom_option_row_sort'] = $value['sort_order']; - } else { - $row['_custom_option_row_title'] = $value['title']; - } - if ($row) { - if (Store::DEFAULT_STORE_ID != $storeId) { - $row['_custom_option_store'] = $this->_storeIdToCode[$storeId]; - } - $customOptionsDataPre[$option['product_id']][$optionId][] = $row; - } + $valuePriceType = ($value['price_type'] == 'percent') ? $value['price_type'] : 'fixed'; + $row['option_title'] = $value['title']; + $row['price'] = $value['price']; + $row['price_type'] = $valuePriceType; + $row['sku'] = $value['sku']; + $customOptionsData[$productId][$storeId][] = $this->optionRowToCellString($row); } + } else { + $customOptionsData[$productId][$storeId][] = $this->optionRowToCellString($row); } $option = null; } $options = null; } - foreach ($customOptionsDataPre as $productId => $optionsData) { - $customOptionsData[$productId] = []; - foreach ($optionsData as $optionId => $optionRows) { - $customOptionsData[$productId] = array_merge( - $customOptionsData[$productId], - $optionRows - ); - } - } - return $customOptionsData; } -- GitLab From 092e57c2e91c82047009097b595699d5221fd5b2 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Fri, 29 May 2015 13:38:35 +0300 Subject: [PATCH 204/396] MAGNIMEX-15: property renaming --- .../CatalogImportExport/Model/Export/Product.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 59bd50b22e3..10fb7126fa8 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -222,7 +222,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity * * @var array */ - protected $_fields_map = [ + protected $_fieldsMap = [ 'image' => 'base_image', 'image_label' => "base_image_label", 'image' => 'base_image', @@ -841,7 +841,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity if (isset($this->_attributeValues[$code][$attrValue]) && !empty($this->_attributeValues[$code])) { $attrValue = $this->_attributeValues[$code][$attrValue]; } - $fieldName = isset($this->_fields_map[$code]) ? $this->_fields_map[$code] : $code; + $fieldName = isset($this->_fieldsMap[$code]) ? $this->_fieldsMap[$code] : $code; if ($storeId != Store::DEFAULT_STORE_ID && isset($data[$itemId][Store::DEFAULT_STORE_ID][$fieldName]) @@ -1079,7 +1079,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity */ private function _customFieldsMapping($rowData) { - foreach ($this->_fields_map as $system_field_name => $file_field_name) { + foreach ($this->_fieldsMap as $system_field_name => $file_field_name) { if (isset($rowData[$system_field_name])) { $rowData[$file_field_name] = $rowData[$system_field_name]; unset($rowData[$system_field_name]); @@ -1098,8 +1098,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity private function _customHeadersMapping($rowData) { foreach ($rowData as $key => $field_name) { - if (isset($this->_fields_map[$field_name])) { - $rowData[$key] = $this->_fields_map[$field_name]; + if (isset($this->_fieldsMap[$field_name])) { + $rowData[$key] = $this->_fieldsMap[$field_name]; } } return $rowData; -- GitLab From 9e3d3c7c30de8cdd7fd9f984502c99569e24723d Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Fri, 29 May 2015 13:59:17 +0300 Subject: [PATCH 205/396] MAGNIMEX-15: status to IndexValueAttributes --- app/code/Magento/CatalogImportExport/Model/Export/Product.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 10fb7126fa8..0532853d724 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -83,6 +83,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity * @var string[] */ protected $_indexValueAttributes = [ + 'status', 'gift_message_available', 'custom_design', ]; -- GitLab From db8ac5c2999a9767948878fd9ef7ce860324353c Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Fri, 29 May 2015 14:57:39 +0300 Subject: [PATCH 206/396] MAGNIMEX-15: created_at, updated_at to separate columns --- .../Magento/CatalogImportExport/Model/Export/Product.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 0532853d724..b175dd6a8bf 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -282,7 +282,9 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity 'small_image', 'small_image_label', 'thumbnail_image', - 'thumbnail_image_label' + 'thumbnail_image_label', + 'created_at', + 'updated_at' ]; /** @@ -863,11 +865,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity } } - if (!empty($data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES])) { + if (!empty($additionalAttributes)) { $data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalAttributes); - foreach ($additionalAttributes as $fieldName => $value) { - unset($data[$itemId][$storeId][$fieldName]); - } } else { unset($data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES]); } -- GitLab From 7d175348db32a2b99ead363a959e0142ceb527a3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Fri, 29 May 2015 15:19:15 +0300 Subject: [PATCH 207/396] MAGNIMEX-15: some attributes to separate columns --- .../CatalogImportExport/Model/Export/Product.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index b175dd6a8bf..58db9b9d912 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -284,7 +284,15 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity 'thumbnail_image', 'thumbnail_image_label', 'created_at', - 'updated_at' + 'updated_at', + 'new_from_date', + 'new_to_date', + 'display_product_options_in', + 'map_price', + 'msrp_price', + 'map_enabled', + 'special_price_from_date', + 'special_price_to_date', ]; /** -- GitLab From 84a85b96d39d25d4aac8ec8f74111ff8cf982696 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Fri, 29 May 2015 15:36:48 +0300 Subject: [PATCH 208/396] MAGNIMEX-15: some attributes to separate columns --- .../CatalogImportExport/Model/Export/Product.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 58db9b9d912..5b3a265ad3d 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -85,7 +85,6 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity protected $_indexValueAttributes = [ 'status', 'gift_message_available', - 'custom_design', ]; /** @@ -293,6 +292,19 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity 'map_enabled', 'special_price_from_date', 'special_price_to_date', + 'gift_message_available', + 'custom_design', + 'custom_design_from', + 'custom_design_to', + 'custom_layout_update', + 'page_layout', + 'product_options_container', + 'msrp_price', + 'msrp_display_actual_price_type', + 'map_enabled', + 'country_of_manufacture', + 'map_price', + 'display_product_options_in', ]; /** -- GitLab From b686e593d6b506c2d267228b1cb5adf2a65417af Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Sat, 30 May 2015 11:15:22 +0300 Subject: [PATCH 209/396] MAGNIMEX-183: Import advanced pricing - grouped price groups fix. --- .../Model/Import/AdvancedPricing.php | 21 +++++++++---------- .../AdvancedPricing/Validator/GroupPrice.php | 4 ++-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index c932b3168ab..88c360ba8ee 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -34,6 +34,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract const TABLE_GROUPED_PRICE = 'catalog_product_entity_group_price'; + const DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE = '0'; + /** * Validation failure message template definitions * @@ -45,10 +47,10 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE => 'Product with specified SKU not found', ValidatorInterface::ERROR_INVALID_TIER_PRICE_QTY => 'Tier Price data price or quantity value is invalid', ValidatorInterface::ERROR_INVALID_TIER_PRICE_SITE => 'Tier Price data website is invalid', - ValidatorInterface::ERROR_INVALID_TIER_PRICE_GROUP => 'Tier Price customer group ID is invalid', + ValidatorInterface::ERROR_INVALID_TIER_PRICE_GROUP => 'Tier Price customer group is invalid', ValidatorInterface::ERROR_TIER_DATA_INCOMPLETE => 'Tier Price data is incomplete', ValidatorInterface::ERROR_INVALID_GROUP_PRICE_SITE => 'Group Price data website is invalid', - ValidatorInterface::ERROR_INVALID_GROUP_PRICE_GROUP => 'Group Price customer group ID is invalid', + ValidatorInterface::ERROR_INVALID_GROUP_PRICE_GROUP => 'Group Price customer group is invalid', ValidatorInterface::ERROR_GROUP_PRICE_DATA_INCOMPLETE => 'Group Price data is incomplete', ]; @@ -173,12 +175,9 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract return !isset($this->_invalidRows[$rowNum]); } $this->_validatedRows[$rowNum] = true; - if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { - if (!isset($this->_oldSkus[$rowData[self::COL_SKU]])) { - $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); - return false; - } - return true; + if (!isset($this->_oldSkus[$rowData[self::COL_SKU]])) { + $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); + return false; } if (!$this->_validator->isValid($rowData)) { foreach ($this->_validator->getMessages() as $message) { @@ -242,7 +241,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract } if (!empty($rowData[self::COL_GROUP_PRICE_WEBSITE])) { $groupPrices[$rowSku][] = [ - 'all_groups' => $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS, + 'all_groups' => self::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, 'customer_group_id' => $this->getCustomerGroupId( $rowData[self::COL_GROUP_PRICE_CUSTOMER_GROUP] ), @@ -259,7 +258,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract /** * Deletes Advanced price data from raw data. */ - protected function deleteAdvancedPricing() + public function deleteAdvancedPricing() { $this->_cachedSkuToDelete = null; $listSku = []; @@ -284,7 +283,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract * * @return bool */ - protected function replaceAdvancedPricing() + public function replaceAdvancedPricing() { } diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php index 6fc87c5e83c..6711b743523 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php @@ -68,8 +68,8 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid || $this->hasEmptyColumns($value)) { $this->_addMessages([self::ERROR_GROUP_PRICE_DATA_INCOMPLETE]); return false; - } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] != AdvancedPricing::VALUE_ALL_GROUPS - && !isset($this->customerGroups[$value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]]) + } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] == AdvancedPricing::VALUE_ALL_GROUPS + || !isset($this->customerGroups[$value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]]) ) { $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_GROUP]); return false; -- GitLab From 4a0f44ec7376448a0456caa4d1c4a28b93f278cb Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Mon, 1 Jun 2015 00:02:57 +0300 Subject: [PATCH 210/396] MAGNIMEX-145: Fix the same images are duplicated in products details --- .../Model/Import/Product.php | 164 ++++++++++++++---- .../Model/Import/Uploader.php | 5 +- 2 files changed, 130 insertions(+), 39 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index 82e2153c4a5..e21db91fffb 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -10,6 +10,7 @@ namespace Magento\CatalogImportExport\Model\Import; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface; +use Magento\Framework\File\Uploader; use Magento\Framework\Model\Resource\Db\TransactionManagerInterface; use Magento\Framework\Model\Resource\Db\ObjectRelationProcessor; use Magento\Framework\Stdlib\DateTime; @@ -541,6 +542,13 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity */ protected $_replaceFlag = null; + /** + * Flag for replace operation. + * + * @var null + */ + protected $cachedImages = null; + /** * @param \Magento\Framework\Json\Helper\Data $jsonHelper * @param \Magento\ImportExport\Helper\Data $importExportData @@ -1209,6 +1217,35 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity return $this; } + protected function _prepareAllMediaFiles() + { + if(empty($this->cachedImages)) { + $mediaFilesList = []; + + $allMedia = $this->_connection->fetchAll($this->_connection->select() + ->from( + ["entity" => $this->_connection->getTableName('catalog_product_entity')], + ['sku'] + )->joinLeft( + ["media_gallery" => $this->_connection->getTableName('catalog_product_entity_media_gallery')], + "entity.entity_id = media_gallery.entity_id", + ['value'] + ) + ); + + /*if(count($allMedia)) { + foreach($allMedia as $mediaFile) { + $mediaFilesList[$mediaFile['sku']] = $mediaFile['value']; + } + }*/ + + //$this->cachedImages = $mediaFilesList; + $this->cachedImages = $allMedia; + } + + return $this; + } + /** * Gather and save information about product entities. * @@ -1222,6 +1259,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity /** @var $resource \Magento\CatalogImportExport\Model\Import\Proxy\Product\Resource */ $resource = $this->_resourceFactory->create(); $priceIsGlobal = $this->_catalogData->isPriceGlobal(); + $this->_prepareAllMediaFiles(); $productLimit = null; $productsQty = null; @@ -1322,54 +1360,104 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity } // 5. Media gallery phase - $mediaGalleryImages = array(); - $mediaGalleryLabels = array(); - if (!empty($rowData[self::COL_MEDIA_IMAGE])) { - $mediaGalleryImages = explode($this->getMultipleValueSeparator(), $rowData[self::COL_MEDIA_IMAGE]); - $mediaGalleryLabels = isset($rowData['_media_image_label']) ? explode($this->getMultipleValueSeparator(), $rowData['_media_image_label']) : array(); - if (count($mediaGalleryLabels) > count($mediaGalleryImages)) { - $mediaGalleryLabels = array_slice($mediaGalleryLabels, 0, count($mediaGalleryImages)); - } elseif (count($mediaGalleryLabels) < count($mediaGalleryImages)) { - $mediaGalleryLabels = array_pad($mediaGalleryLabels, count($mediaGalleryImages), ''); + $dispretionPath = Uploader::getDispretionPath($rowData[self::COL_MEDIA_IMAGE]); + $imageName = preg_replace('/[^a-z0-9\._-]+/i','', $rowData[self::COL_MEDIA_IMAGE]); + $fullDispretionPath = $dispretionPath.'/'.$imageName; + $imageIsSet = null; + $imageFromProduct = null; + $imageInProductIsSet = null; + foreach($this->cachedImages as $image) { + if($image['sku']==$rowData[self::COL_SKU] && preg_replace('/_[0-9]+/','', $image['value'])==$fullDispretionPath) { + $imageInProductIsSet = true; + $imageFromProduct = $image['value']; + break; + } elseif(in_array($fullDispretionPath, $image)) { + $imageIsSet = true; + break; } } + if( ($imageInProductIsSet && $imageFromProduct!=$fullDispretionPath) || (!isset($imageIsSet) && !isset($imageInProductIsSet)) ) { + $mediaGalleryImages = array(); + $mediaGalleryLabels = array(); + if (!empty($rowData[self::COL_MEDIA_IMAGE])) { + $mediaGalleryImages = explode($this->getMultipleValueSeparator(), $rowData[self::COL_MEDIA_IMAGE]); + $mediaGalleryLabels = isset($rowData['_media_image_label']) ? explode($this->getMultipleValueSeparator(), $rowData['_media_image_label']) : array(); + if (count($mediaGalleryLabels) > count($mediaGalleryImages)) { + $mediaGalleryLabels = array_slice($mediaGalleryLabels, 0, count($mediaGalleryImages)); + } elseif (count($mediaGalleryLabels) < count($mediaGalleryImages)) { + $mediaGalleryLabels = array_pad($mediaGalleryLabels, count($mediaGalleryImages), ''); + } + } - foreach ($this->_imagesArrayKeys as $imageCol) { - if (!empty($rowData[$imageCol]) && ($imageCol != self::COL_MEDIA_IMAGE) && !in_array($rowData[$imageCol], $mediaGalleryImages)) { - $mediaGalleryImages[] = $rowData[$imageCol]; - $mediaGalleryLabels[] = isset($rowData[$imageCol . '_label']) ? $rowData[$imageCol . '_label'] : ''; + foreach ($this->_imagesArrayKeys as $imageCol) { + if (!empty($rowData[$imageCol]) && ($imageCol != self::COL_MEDIA_IMAGE) && !in_array($rowData[$imageCol], $mediaGalleryImages)) { + $mediaGalleryImages[] = $rowData[$imageCol]; + $mediaGalleryLabels[] = isset($rowData[$imageCol . '_label']) ? $rowData[$imageCol . '_label'] : ''; + } } - } - $rowData[self::COL_MEDIA_IMAGE] = array(); + $rowData[self::COL_MEDIA_IMAGE] = array(); + foreach ($mediaGalleryImages as $mediaImage) { + if (!array_key_exists($mediaImage, $uploadedGalleryFiles)) { + $uploadedGalleryFiles[$mediaImage] = $this->_uploadMediaFiles( + trim($mediaImage) + ); + } + $rowData[self::COL_MEDIA_IMAGE][] = $uploadedGalleryFiles[$mediaImage]; + } - foreach ($mediaGalleryImages as $mediaImage) { - if (!array_key_exists($mediaImage, $uploadedGalleryFiles)) { - $uploadedGalleryFiles[$mediaImage] = $this->_uploadMediaFiles( - trim($mediaImage) - ); + foreach ($this->_imagesArrayKeys as $imageCol) { + if (!empty($rowData[$imageCol]) && ($imageCol != self::COL_MEDIA_IMAGE)) { + $rowData[$imageCol] = $uploadedGalleryFiles[$rowData[$imageCol]]; + } } - $rowData[self::COL_MEDIA_IMAGE][] = $uploadedGalleryFiles[$mediaImage]; - } - foreach ($this->_imagesArrayKeys as $imageCol) { - if (!empty($rowData[$imageCol]) && ($imageCol != self::COL_MEDIA_IMAGE)) { - $rowData[$imageCol] = $uploadedGalleryFiles[$rowData[$imageCol]]; + if (!empty($rowData[self::COL_MEDIA_IMAGE]) && is_array($rowData[self::COL_MEDIA_IMAGE])) { + $position = 0; + + foreach ($rowData[self::COL_MEDIA_IMAGE] as $media_image) { + $mediaGallery[$rowSku][] = [ + 'attribute_id' => $this->getMediaGalleryAttributeId(), + 'label' => isset($mediaGalleryLabels[$position]) ? $mediaGalleryLabels[$position] : '', + 'position' => $position++, + 'disabled' => '', + 'value' => $media_image, + ]; + } + } + } elseif($imageInProductIsSet && $imageFromProduct==$fullDispretionPath) { + $mediaGalleryImages = array(); + $mediaGalleryLabels = array(); + if (!empty($rowData[self::COL_MEDIA_IMAGE])) { + $mediaGalleryImages = explode($this->getMultipleValueSeparator(), $rowData[self::COL_MEDIA_IMAGE]); + $mediaGalleryLabels = isset($rowData['_media_image_label']) ? explode($this->getMultipleValueSeparator(), $rowData['_media_image_label']) : array(); + if (count($mediaGalleryLabels) > count($mediaGalleryImages)) { + $mediaGalleryLabels = array_slice($mediaGalleryLabels, 0, count($mediaGalleryImages)); + } elseif (count($mediaGalleryLabels) < count($mediaGalleryImages)) { + $mediaGalleryLabels = array_pad($mediaGalleryLabels, count($mediaGalleryImages), ''); + } } - } - if (!empty($rowData[self::COL_MEDIA_IMAGE]) && is_array($rowData[self::COL_MEDIA_IMAGE])) { - $position = 0; + foreach ($this->_imagesArrayKeys as $imageCol) { + if (!empty($rowData[$imageCol]) && ($imageCol != self::COL_MEDIA_IMAGE) && !in_array($rowData[$imageCol], $mediaGalleryImages)) { + $mediaGalleryImages[] = $rowData[$imageCol]; + $mediaGalleryLabels[] = isset($rowData[$imageCol . '_label']) ? $rowData[$imageCol . '_label'] : ''; + } + } - foreach($rowData[self::COL_MEDIA_IMAGE] as $media_image) { - $mediaGallery[$rowSku][] = [ - 'attribute_id' => $this->getMediaGalleryAttributeId(), - 'label' => isset($mediaGalleryLabels[$position]) ? $mediaGalleryLabels[$position] : '', - 'position' => $position++, - 'disabled' => '', - 'value' => $media_image, - ]; + $rowData[self::COL_MEDIA_IMAGE] = array(); + foreach ($mediaGalleryImages as $mediaImage) { + if (!array_key_exists($mediaImage, $uploadedGalleryFiles)) { + $uploadedGalleryFiles[$mediaImage] = $this->_uploadMediaFiles( + trim($mediaImage), + true + ); + } + $rowData[self::COL_MEDIA_IMAGE][] = $uploadedGalleryFiles[$mediaImage]; } + } else { + $this->addRowError(__("Image already exists for '%s'"), $rowNum, self::COL_MEDIA_IMAGE); + } // 6. Attributes phase @@ -1614,10 +1702,10 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity * @param string $fileName * @return string */ - protected function _uploadMediaFiles($fileName) + protected function _uploadMediaFiles($fileName, $renameFileOff=false) { try { - $res = $this->_getUploader()->move($fileName); + $res = $this->_getUploader()->move($fileName, $renameFileOff); return $res['file']; } catch (\Exception $e) { return ''; diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php b/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php index d694b772023..772f5182860 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php @@ -137,8 +137,11 @@ class Uploader extends \Magento\MediaStorage\Model\File\Uploader * @param string $fileName * @return array */ - public function move($fileName) + public function move($fileName, $renameFileOff=false) { + if($renameFileOff) { + $this->setAllowRenameFiles(false); + } if (preg_match('/\bhttps?:\/\//i', $fileName, $matches)) { $url = str_replace($matches[0], '', $fileName); $read = $this->_readFactory->create($url, DriverPool::HTTP); -- GitLab From 41d1205da8771428bf38770eda31d76d03a95998 Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Mon, 1 Jun 2015 00:07:12 +0300 Subject: [PATCH 211/396] MAGNIMEX-145: Duplicated Images --- .../CatalogImportExport/Model/Import/Product.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index e21db91fffb..40383b9447c 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -1217,11 +1217,14 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity return $this; } + /** + * Prepare all media files + * + * @return $this + */ protected function _prepareAllMediaFiles() { if(empty($this->cachedImages)) { - $mediaFilesList = []; - $allMedia = $this->_connection->fetchAll($this->_connection->select() ->from( ["entity" => $this->_connection->getTableName('catalog_product_entity')], @@ -1232,17 +1235,8 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ['value'] ) ); - - /*if(count($allMedia)) { - foreach($allMedia as $mediaFile) { - $mediaFilesList[$mediaFile['sku']] = $mediaFile['value']; - } - }*/ - - //$this->cachedImages = $mediaFilesList; $this->cachedImages = $allMedia; } - return $this; } -- GitLab From baf16374b60b735438cf9c6a073db3327c2ecc0d Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Mon, 1 Jun 2015 11:20:48 +0300 Subject: [PATCH 212/396] MAGNIMEX-15: change filter type for updated_at --- .../Block/Adminhtml/Export/Filter.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php index c7d648b4d54..57845f2a27e 100644 --- a/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php +++ b/app/code/Magento/ImportExport/Block/Adminhtml/Export/Filter.php @@ -28,6 +28,15 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended */ protected $_importExportData = null; + /** + * Local filters types base on attribute code + * + * @var \Magento\ImportExport\Helper\Data + */ + protected $_filterTypeByAttrCode = [ + 'updated_at' => \Magento\ImportExport\Model\Export::FILTER_TYPE_DATE, + ]; + /** * @param \Magento\Backend\Block\Template\Context $context * @param \Magento\Backend\Helper\Data $backendHelper @@ -325,7 +334,15 @@ class Filter extends \Magento\Backend\Block\Widget\Grid\Extended if (is_array($values) && isset($values[$row->getAttributeCode()])) { $value = $values[$row->getAttributeCode()]; } - switch (\Magento\ImportExport\Model\Export::getAttributeFilterType($row)) { + + $code = $row->getAttributeCode(); + if (isset($this->_filterTypeByAttrCode[$code])) { + $filterType =$this->_filterTypeByAttrCode[$code]; + } else { + $filterType = \Magento\ImportExport\Model\Export::getAttributeFilterType($row); + } + + switch ($filterType) { case \Magento\ImportExport\Model\Export::FILTER_TYPE_SELECT: $cell = $this->_getSelectHtmlWithValue($row, $value); break; -- GitLab From cbe539ba3b2fec422f2abbad5edb1546c2643ae2 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Mon, 1 Jun 2015 18:06:43 +0300 Subject: [PATCH 213/396] MAGNIMEX-14: Downloading sample file - link for sample file implemented --- .../Block/Adminhtml/Import/Edit/Form.php | 16 +++++++++++++- .../templates/import/form/before.phtml | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php index fd6f58306f1..5e3bb74aa96 100644 --- a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php +++ b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php @@ -84,7 +84,8 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic 'label' => __('Entity Type'), 'required' => true, 'onchange' => 'varienImport.handleEntityTypeSelector();', - 'values' => $this->_entityFactory->create()->toOptionArray() + 'values' => $this->_entityFactory->create()->toOptionArray(), + 'after_element_html' => $this->getDownloadSampleFileHtml(), ] ); @@ -174,4 +175,17 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic return parent::_prepareForm(); } + + /** + * Get download sample file html + * + * @return string + */ + protected function getDownloadSampleFileHtml() + { + $html = '<span id="sample-file-span" style="display: none;"><a id="sample-file-link" href="#">' + . __('Download Sample File') + . '</a></span>'; + return $html; + } } diff --git a/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml b/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml index 661218ae1e3..310cae4da45 100644 --- a/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml +++ b/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml @@ -31,6 +31,12 @@ require(['jquery', 'prototype'], function(jQuery){ */ entityBehaviors: <?php echo $block->getEntityBehaviors() ?>, + /** + * Base url + * @type {string} + */ + sampleFilesBaseUrl: '<?php echo $block->getBaseUrl() ?>' + 'sample/files/', + /** * Reset selected index * @param {string} elementId @@ -92,6 +98,19 @@ require(['jquery', 'prototype'], function(jQuery){ } }, + showSampleFile: function(entityId) { + var sampleFileSpan = jQuery('#sample-file-span'); + if (entityId) { + var sampleFileLink = this.sampleFilesBaseUrl + entityId + '.csv'; + jQuery('#sample-file-link').attr('href', sampleFileLink); + if (sampleFileSpan.is(':hidden')) { + sampleFileSpan.show(); + } + } else { + sampleFileSpan.hide(); + } + }, + /** * Handle value change in entity type selector */ @@ -100,9 +119,11 @@ require(['jquery', 'prototype'], function(jQuery){ if (entity && entity.val()) { this.showBehavior(entity.val()); this.showUploadFile(true); + this.showSampleFile(entity.val()); } else { this.showBehavior(false); this.showUploadFile(false); + this.showSampleFile(false); } }, -- GitLab From 38d014d1cac7b79db0ccc321494c8f8f1e6c132f Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Mon, 1 Jun 2015 18:09:14 +0300 Subject: [PATCH 214/396] MAGNIMEX-14: Downloading sample file - docBlock fix --- .../view/adminhtml/templates/import/form/before.phtml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml b/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml index 310cae4da45..6f417bae148 100644 --- a/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml +++ b/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml @@ -98,6 +98,10 @@ require(['jquery', 'prototype'], function(jQuery){ } }, + /** + * Show/hide sample file link + * @param {string} entityId + */ showSampleFile: function(entityId) { var sampleFileSpan = jQuery('#sample-file-span'); if (entityId) { -- GitLab From 06c932574622fae491d6defce278d58e040a3496 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Mon, 1 Jun 2015 15:26:32 +0000 Subject: [PATCH 215/396] MAGNIMEX-185: Unit tests - Fixed sources' classes: TierPrice and AdvancedPricing --- .../Model/Import/AdvancedPricing.php | 4 +--- .../Model/Import/AdvancedPricing/Validator/TierPrice.php | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 88c360ba8ee..7d467e4a966 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -187,9 +187,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract if (isset($rowData[self::COL_SKU])) { $sku = $rowData[self::COL_SKU]; } - if (null === $sku) { - $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); - } elseif (false === $sku) { + if (false === $sku) { $this->addRowError(ValidatorInterface::ERROR_ROW_IS_ORPHAN, $rowNum); } return !isset($this->_invalidRows[$rowNum]); diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php index 2ecc1c232e1..c60a26dfff8 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php @@ -77,7 +77,7 @@ class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valida ) { $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_GROUP]); return false; - } elseif ($value[AdvancedPricing::COL_TIER_PRICE_QTY] <= 0 || $value['tier_price'] <= 0) { + } elseif ($value[AdvancedPricing::COL_TIER_PRICE_QTY] <= 0 || $value[AdvancedPricing::COL_TIER_PRICE] <= 0) { $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_QTY]); return false; } -- GitLab From ff392858781757780139742118bf5299a98c5207 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Mon, 1 Jun 2015 15:29:31 +0000 Subject: [PATCH 216/396] MAGNIMEX-185: Unit tests --- .../Validator/GroupPriceTest.php | 303 +++++++++ .../Validator/TierPriceTest.php | 351 ++++++++++ .../AdvancedPricing/Validator/WebsiteTest.php | 210 ++++++ .../Import/AdvancedPricing/ValidatorTest.php | 86 +++ .../Unit/Model/Import/AdvancedPricingTest.php | 599 ++++++++++++++++++ .../Product/Price/Plugin/ImportTest.php | 49 ++ 6 files changed, 1598 insertions(+) create mode 100644 app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php create mode 100644 app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php new file mode 100644 index 00000000000..20e15309f08 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php @@ -0,0 +1,303 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing\Validator; + +class GroupPriceTest extends \PHPUnit_Framework_TestCase +{ + + /** + * @var \Magento\Customer\Api\GroupRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $groupRepository; + + /** + * @var \Magento\Framework\Api\SearchCriteriaBuilder|\PHPUnit_Framework_MockObject_MockObject + */ + protected $searchCriteriaBuilder; + + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeResolver; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice|\PHPUnit_Framework_MockObject_MockObject + */ + protected $groupPrice; + + public function setUp() + { + $this->groupRepository = $this->getMockBuilder('\Magento\Customer\Api\GroupRepositoryInterface') + ->disableOriginalConstructor() + ->setMethods(['getList']) + ->getMockForAbstractClass(); + $this->searchCriteriaBuilder = $this->getMock( + '\Magento\Framework\Api\SearchCriteriaBuilder', + [], + [], + '', + false + ); + $this->storeResolver = $this->getMock( + '\Magento\CatalogImportExport\Model\Import\Product\StoreResolver', + [], + [], + '', + false + ); + + $this->groupPrice = $this->getMock( + 'Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice', + ['isValidValueAndLength', 'hasEmptyColumns', '_addMessages'], + [ + $this->groupRepository, + $this->searchCriteriaBuilder, + $this->storeResolver, + ], + '' + ); + } + + public function testInitInternalCalls() + { + $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); + $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); + $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); + $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + + $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') + ->disableOriginalConstructor() + ->setMethods(['getCode', 'getId']) + ->getMockForAbstractClass(); + $groupTest->expects($this->once())->method('getCode'); + $groupTest->expects($this->once())->method('getId'); + $groups = [$groupTest]; + $groupSearchResult->expects($this->once())->method('getItems')->willReturn($groups); + + $this->groupPrice->init(); + } + + public function testInitAddToCustomerGroups() + { + $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); + $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); + $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); + $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + + $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') + ->disableOriginalConstructor() + ->setMethods(['getCode', 'getId']) + ->getMockForAbstractClass(); + + $expectedCode = 'code'; + $expectedId = 'id'; + $expectedCustomerGroups = [ + $expectedCode => $expectedId, + ]; + $groupTest->expects($this->once())->method('getCode')->willReturn($expectedCode); + $groupTest->expects($this->once())->method('getId')->willReturn($expectedId); + $groups = [$groupTest]; + $groupSearchResult->expects($this->once())->method('getItems')->willReturn($groups); + + $this->groupPrice->init(); + $this->assertEquals($expectedCustomerGroups, $this->getPropertyValue($this->groupPrice, 'customerGroups')); + } + + public function testIsValidInitCall() + { + $groupPrice = $this->groupPrice = $this->getMock( + 'Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice', + ['init', '_clearMessages'], + [ + $this->groupRepository, + $this->searchCriteriaBuilder, + $this->storeResolver, + ], + '' + ); + $groupPrice->expects($this->once())->method('_clearMessages'); + $this->setPropertyValue($groupPrice, 'customerGroups', false); + $groupPrice->expects($this->once())->method('init'); + + $groupPrice->isValid([]); + } + + /** + * @dataProvider isValidResultFalseDataProvider + */ + public function testIsValidResultFalse($value, $hasEmptyColumns, $customerGroups) + { + $this->groupPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(true); + $this->groupPrice->expects($this->any())->method('hasEmptyColumns')->willReturn($hasEmptyColumns); + $this->setPropertyValue($this->groupPrice, 'customerGroups', $customerGroups); + + $result = $this->groupPrice->isValid($value); + $this->assertFalse($result); + } + + public function testIsValidResultTrue() + { + $this->groupPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(false); + $this->setPropertyValue($this->groupPrice, 'customerGroups', true); + + $result = $this->groupPrice->isValid([]); + $this->assertTrue($result); + } + + /** + * @dataProvider isValid_addMessagesCallDataProvider + */ + public function testIsValid_addMessagesCall($value, $hasEmptyColumns, $customerGroups, $expectedMessages) + { + $this->groupPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(true); + $this->groupPrice->expects($this->any())->method('hasEmptyColumns')->willReturn($hasEmptyColumns); + $this->setPropertyValue($this->groupPrice, 'customerGroups', $customerGroups); + + $this->groupPrice->expects($this->once())->method('_addMessages')->with($expectedMessages); + $this->groupPrice->isValid($value); + } + + public function testGetCustomerGroupsInitCall() + { + $groupPrice = $this->groupPrice = $this->getMock( + 'Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice', + ['init'], + [ + $this->groupRepository, + $this->searchCriteriaBuilder, + $this->storeResolver, + ], + '' + ); + $this->setPropertyValue($groupPrice, 'customerGroups', false); + $groupPrice->expects($this->once())->method('init'); + + $groupPrice->getCustomerGroups(); + } + + public function isValidResultFalseDataProvider() + { + return [ + //first if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => null, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + ], + '$hasEmptyColumns' => true, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + //second if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS, + ], + '$hasEmptyColumns' => false, + '$customerGroups' => [ + 'group price customer value' => 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer value', + ], + '$hasEmptyColumns' => false, + '$customerGroups' => [ + 'group price customer value' => null + ], + ], + ]; + } + + public function isValid_addMessagesCallDataProvider() + { + return [ + //first if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS => 'value', + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_GROUP_PRICE_DATA_INCOMPLETE], + ], + //second if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS => 'not ALL GROUPS', + ], + '$hasEmptyColumns' => false, + '$customerGroups' => [ + 'value' => null + ], + '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_INVALID_GROUP_PRICE_GROUP], + ], + ]; + } + + /** + * Get any object property value. + * + * @param $object + * @param $property + */ + protected function getPropertyValue($object, $property) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + + return $reflectionProperty->getValue($object); + } + + /** + * Set object property value. + * + * @param $object + * @param $property + * @param $value + */ + protected function setPropertyValue(&$object, $property, $value) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($object, $value); + + return $object; + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php new file mode 100644 index 00000000000..1b61d339f0a --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php @@ -0,0 +1,351 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing\Validator; + +class TierPriceTest extends \PHPUnit_Framework_TestCase +{ + + + /** + * @var \Magento\Customer\Api\GroupRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $groupRepository; + + /** + * @var \Magento\Framework\Api\SearchCriteriaBuilder|\PHPUnit_Framework_MockObject_MockObject + */ + protected $searchCriteriaBuilder; + + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeResolver; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\TierPrice|\PHPUnit_Framework_MockObject_MockObject + */ + protected $tierPrice; + + + public function setUp() + { + $this->groupRepository = $this->getMockBuilder('\Magento\Customer\Api\GroupRepositoryInterface') + ->disableOriginalConstructor() + ->setMethods(['getList']) + ->getMockForAbstractClass(); + + $this->searchCriteriaBuilder = $this->getMock( + '\Magento\Framework\Api\SearchCriteriaBuilder', + [], + [], + '', + false + ); + $this->storeResolver = $this->getMock( + '\Magento\CatalogImportExport\Model\Import\Product\StoreResolver', + [], + [], + '', + false + ); + + $this->tierPrice = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\TierPrice', + ['isValidValueAndLength', 'hasEmptyColumns', '_addMessages'], + [ + $this->groupRepository, + $this->searchCriteriaBuilder, + $this->storeResolver, + ], + '' + ); + } + + public function testInitInternalCalls() + { + $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); + $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); + $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); + $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + + $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') + ->disableOriginalConstructor() + ->setMethods(['getCode', 'getId']) + ->getMockForAbstractClass(); + $groupTest->expects($this->once())->method('getCode'); + $groupTest->expects($this->once())->method('getId'); + $groups = [$groupTest]; + $groupSearchResult->expects($this->once())->method('getItems')->willReturn($groups); + + $this->tierPrice->init(); + } + + public function testInitAddToCustomerGroups() + { + $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); + $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); + $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); + $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + + $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') + ->disableOriginalConstructor() + ->setMethods(['getCode', 'getId']) + ->getMockForAbstractClass(); + + $expectedCode = 'code'; + $expectedId = 'id'; + $expectedCustomerGroups = [ + $expectedCode => $expectedId, + ]; + $groupTest->expects($this->once())->method('getCode')->willReturn($expectedCode); + $groupTest->expects($this->once())->method('getId')->willReturn($expectedId); + $groups = [$groupTest]; + $groupSearchResult->expects($this->once())->method('getItems')->willReturn($groups); + + $this->tierPrice->init(); + $this->assertEquals($expectedCustomerGroups, $this->getPropertyValue($this->tierPrice, 'customerGroups')); + } + + public function testIsValidInitCall() + { + $tierPrice = $this->tierPrice = $this->getMock( + 'Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice', + ['init', '_clearMessages'], + [ + $this->groupRepository, + $this->searchCriteriaBuilder, + $this->storeResolver, + ], + '' + ); + $tierPrice->expects($this->once())->method('_clearMessages'); + $this->setPropertyValue($tierPrice, 'customerGroups', false); + $tierPrice->expects($this->once())->method('init'); + + $tierPrice->isValid([]); + } + + /** + * @dataProvider isValidResultFalseDataProvider + */ + public function testIsValidResultFalse($value, $hasEmptyColumns, $customerGroups) + { + $this->tierPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(true); + $this->tierPrice->expects($this->any())->method('hasEmptyColumns')->willReturn($hasEmptyColumns); + $this->setPropertyValue($this->tierPrice, 'customerGroups', $customerGroups); + + $result = $this->tierPrice->isValid($value); + $this->assertFalse($result); + } + + public function testIsValidResultTrue() + { + $this->tierPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(false); + $this->setPropertyValue($this->tierPrice, 'customerGroups', true); + + $result = $this->tierPrice->isValid([]); + $this->assertTrue($result); + } + + /** + * @dataProvider isValid_addMessagesCallDataProvider + */ + public function testIsValid_addMessagesCall($value, $hasEmptyColumns, $customerGroups, $expectedMessages) + { + $this->tierPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(true); + $this->tierPrice->expects($this->any())->method('hasEmptyColumns')->willReturn($hasEmptyColumns); + $this->setPropertyValue($this->tierPrice, 'customerGroups', $customerGroups); + + $this->tierPrice->expects($this->once())->method('_addMessages')->with($expectedMessages); + $this->tierPrice->isValid($value); + } + + public function isValidResultFalseDataProvider() + { + return [ + //first if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => null, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => true, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + //second if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'not ALL GROUPS', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + //third if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => -1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => -1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + ], + ]; + } + + public function isValid_addMessagesCallDataProvider() + { + return [ + //first if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_TIER_DATA_INCOMPLETE], + ], + //second if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'not ALL GROUPS', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_INVALID_TIER_PRICE_GROUP], + ], + //third if condition cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => -1000, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + ], + '$hasEmptyColumns' => null, + '$customerGroups' => [ + 'value' => 'value' + ], + '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_INVALID_TIER_PRICE_QTY], + ], + ]; + } + + /** + * Get any object property value. + * + * @param $object + * @param $property + */ + protected function getPropertyValue($object, $property) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + + return $reflectionProperty->getValue($object); + } + + /** + * Set object property value. + * + * @param $object + * @param $property + * @param $value + */ + protected function setPropertyValue(&$object, $property, $value) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($object, $value); + + return $object; + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php new file mode 100644 index 00000000000..56b8962b1fc --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php @@ -0,0 +1,210 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing\Validator; + +class WebsiteTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Store\Model\WebSite|\PHPUnit_Framework_MockObject_MockObject + */ + protected $webSiteModel; + + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeResolver; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website|\PHPUnit_Framework_MockObject_MockObject + */ + protected $website; + + public function setUp() + { + $this->webSiteModel = $this->getMock( + '\Magento\Store\Model\WebSite', + ['getBaseCurrency'], + [], + '', + false + ); + $this->storeResolver = $this->getMock( + '\Magento\CatalogImportExport\Model\Import\Product\StoreResolver', + ['getWebsiteCodeToId'], + [], + '', + false + ); + + $this->website = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website', + ['getAllWebsitesValue', '_clearMessages', '_addMessages'], + [ + $this->storeResolver, + $this->webSiteModel, + ], + '' + ); + } + + public function testInit() + { + $result = $this->website->init(); + + $this->assertEquals($this->website, $result); + } + + /** + * @dataProvider isValidReturnDataProvider + */ + public function testIsValidReturn($value, $allWebsitesValue, $allWebsitesValueColTierPriceWebsite, $allWebsitesValueColGroupPriceWebsite, $expectedResult) + { + $this->website->expects($this->once())->method('_clearMessages'); + $this->website->expects($this->atLeastOnce())->method('getAllWebsitesValue')->willReturn($allWebsitesValue); + $this->storeResolver->method('getWebsiteCodeToId')->willReturnMap([ + [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE], $allWebsitesValueColTierPriceWebsite], + [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $allWebsitesValueColGroupPriceWebsite], + ]); + + $result = $this->website->isValid($value); + $this->assertEquals($expectedResult, $result); + } + + public function testIsValidReturn_addMessagesCall() + { + $value = [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ]; + $allWebsitesValue = 'not tier|group price website value'; + $allWebsitesValueColTierPriceWebsite = false; + $allWebsitesValueColGroupPriceWebsite = 'value'; + $expectedMessages = [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website::ERROR_INVALID_WEBSITE]; + + $this->website->expects($this->once())->method('_clearMessages'); + $this->website->expects($this->atLeastOnce())->method('getAllWebsitesValue')->willReturn($allWebsitesValue); + $this->storeResolver->method('getWebsiteCodeToId')->willReturnMap([ + [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE], $allWebsitesValueColTierPriceWebsite], + [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $allWebsitesValueColGroupPriceWebsite], + ]); + + $this->website->expects($this->once())->method('_addMessages')->with($expectedMessages); + $result = $this->website->isValid($value); + } + + public function testGetAllWebsitesValue() + { + $currencyCode = 'currencyCodeValue'; + $currency = $this->getMock('\Magento\Directory\Model\Currency', ['getCurrencyCode'], [], '', false); + $currency->expects($this->once())->method('getCurrencyCode')->willReturn($currencyCode); + + $this->webSiteModel->expects($this->once())->method('getBaseCurrency')->willReturn($currency); + + $expectedResult = \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_WEBSITES . ' [' . $currencyCode . ']'; + + $website = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website', + null, + [ + $this->storeResolver, + $this->webSiteModel, + ], + '' + ); + + $result = $website->getAllWebsitesValue(); + $this->assertEquals($expectedResult, $result); + } + + public function isValidReturnDataProvider() + { + return [ + //false cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ], + '$allWebsitesValue' => 'not tier|group price website value', + '$allWebsitesValueColTierPriceWebsite' => false, + '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$expectedResult' => false, + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ], + '$allWebsitesValue' => 'not tier|group price website value', + '$allWebsitesValueColTierPriceWebsite' => 'value', + '$allWebsitesValueColGroupPriceWebsite' => false, + '$expectedResult' => false, + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ], + '$allWebsitesValue' => 'not tier|group price website value', + '$allWebsitesValueColTierPriceWebsite' => 'value', + '$allWebsitesValueColGroupPriceWebsite' => false, + '$expectedResult' => false, + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => false, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ], + '$allWebsitesValue' => 'not tier|group price website value', + '$allWebsitesValueColTierPriceWebsite' => 'value', + '$allWebsitesValueColGroupPriceWebsite' => false, + '$expectedResult' => false, + ], + //true cases + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ], + '$allWebsitesValue' => 'tier value', + '$allWebsitesValueColTierPriceWebsite' => 'value', + '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$expectedResult' => true, + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ], + '$allWebsitesValue' => 'group value', + '$allWebsitesValueColTierPriceWebsite' => 'value', + '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$expectedResult' => true, + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => false, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + ], + '$allWebsitesValue' => 'not tier|group price website value', + '$allWebsitesValueColTierPriceWebsite' => 'value', + '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$expectedResult' => true, + ], + [ + '$value' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => false, + ], + '$allWebsitesValue' => 'not tier|group price website value', + '$allWebsitesValueColTierPriceWebsite' => 'value', + '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$expectedResult' => true, + ], + ]; + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php new file mode 100644 index 00000000000..1b84bcecfd5 --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php @@ -0,0 +1,86 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing; + +class ValidatorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator |\PHPUnit_Framework_MockObject_MockObject + */ + protected $validator; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator |\PHPUnit_Framework_MockObject_MockObject + */ + protected $validators; + + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface |\PHPUnit_Framework_MockObject_MockObject + */ + protected $validatorTest; + + public function setUp() + { + $this->validatorTest = $this->getMockForAbstractClass( + 'Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface', + [], + '', + false + ); + $messages = ['messages']; + $this->validatorTest->expects($this->any())->method('getMessages')->willReturn($messages); + $this->validators = [$this->validatorTest]; + + $this->validator = $this->getMock( + 'Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator', + ['_clearMessages', '_addMessages'], + [$this->validators] + ); + } + + /** + * @dataProvider isValidDataProvider + */ + public function testIsValid($validatorResult, $expectedResult) + { + $this->validator->expects($this->once())->method('_clearMessages'); + $value = 'value'; + $this->validatorTest->expects($this->once())->method('isValid')->with($value)->willReturn($validatorResult); + + $result = $this->validator->isValid($value); + $this->assertEquals($expectedResult, $result); + } + + public function testIsValid_addMessagesCall() + { + $value = 'value'; + $this->validatorTest->expects($this->once())->method('isValid')->willReturn(false); + $this->validator->expects($this->once())->method('_addMessages'); + + $this->validator->isValid($value); + } + + public function testInit() + { + $this->validatorTest->expects($this->once())->method('init'); + + $this->validator->init(); + } + + public function isValidDataProvider() + { + return [ + [ + '$validatorResult' => true, + '$expectedResult' => true, + ], + [ + '$validatorResult' => false, + '$expectedResult' => false, + ] + ]; + } +} \ No newline at end of file diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php new file mode 100644 index 00000000000..05aa6d03e9d --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php @@ -0,0 +1,599 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import; + +class AdvancedPricingTest extends \PHPUnit_Framework_TestCase +{ + + /** + * @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory |\PHPUnit_Framework_MockObject_MockObject + */ + protected $_resourceFactory; + + /** + * @var \Magento\Catalog\Helper\Data |\PHPUnit_Framework_MockObject_MockObject + */ + protected $_catalogData; + + /** + * @var \Magento\Catalog\Model\Product |\PHPUnit_Framework_MockObject_MockObject + */ + protected $_productModel; + + /** + * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver |\PHPUnit_Framework_MockObject_MockObject + */ + protected $_storeResolver; + + /** + * @var \Magento\CatalogImportExport\Model\Import\Product|PHPUnit_Framework_MockObject_MockObject + */ + protected $_importProduct; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator |\PHPUnit_Framework_MockObject_MockObject + */ + protected $_validator; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website |\PHPUnit_Framework_MockObject_MockObject + */ + protected $websiteValidator; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice |\PHPUnit_Framework_MockObject_MockObject + */ + protected $groupPriceValidator; + + /** + * @var \Magento\ImportExport\Model\Resource\Helper |\PHPUnit_Framework_MockObject_MockObject + */ + protected $_resourceHelper; + + /** + * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $_connection; + + /** + * @var \Magento\ImportExport\Model\Resource\Import\Data|\PHPUnit_Framework_MockObject_MockObject + */ + protected $_dataSourceModel; + + /** + * @var array + */ + protected $_cachedSkuToDelete; + + /** + * @var array + */ + protected $_oldSkus; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing |\PHPUnit_Framework_MockObject_MockObject + */ + protected $advancedPricing; + + public function setUp() + { + $this->jsonHelper = $this->getMock('\Magento\Framework\Json\Helper\Data', [], [], '', false); + $this->_importExportData = $this->getMock('\Magento\ImportExport\Helper\Data', [], [], '', false); + $this->_resourceHelper = $this->getMock('\Magento\ImportExport\Model\Resource\Helper', [], [], '', false); + $this->_resource = $this->getMock( + '\Magento\Framework\App\Resource', + ['getConnection'], + [], + '', + false + ); + $this->_connection = $this->getMockForAbstractClass('\Magento\Framework\DB\Adapter\AdapterInterface', [], '', false); + $this->_resource->expects($this->any())->method('getConnection')->willReturn($this->_connection); + $this->_dataSourceModel = $this->getMock('\Magento\ImportExport\Model\Resource\Import\Data', [], [], '', false); + $this->_resourceFactory = $this->getMock('\Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory', [], [], '', false); + $this->_productModel = $this->getMock('\Magento\Catalog\Model\Product', [], [], '', false); + $this->_catalogData = $this->getMock('\Magento\Catalog\Helper\Data', [], [], '', false); + $this->_storeResolver = $this->getMock('\Magento\CatalogImportExport\Model\Import\Product\StoreResolver', [], [], '', false); + $this->_importProduct = $this->getMock('\Magento\CatalogImportExport\Model\Import\Product', [], [], '', false); + $this->_validator = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator', + ['isValid', 'getMessages'], + [], + '', + false + ); + $this->websiteValidator = $this->getMock('\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website', [], [], '', false); + $this->groupPriceValidator = $this->getMock('\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice', [], [], '', false); + + $this->advancedPricing = $this->getAdvancedPricingMock([ + 'retrieveOldSkus', + 'validateRow', + 'addRowError', + 'saveProductPrices', + 'getCustomerGroupId', + 'getWebSiteId', + 'deleteProductTierAndGroupPrices', + ]); + + $this->advancedPricing->expects($this->any())->method('retrieveOldSkus')->willReturn([]); + } + + public function testGetEntityTypeCode() + { + $result = $this->advancedPricing->getEntityTypeCode(); + $expectedResult = 'advanced_pricing'; + + $this->assertEquals($expectedResult, $result); + } + + /** + * @dataProvider validateRowResultDataProvider + */ + public function testValidateRowResult($rowData, $validatedRows, $invalidRows, $oldSkus, $expectedResult) + { + $rowNum = 0; + $advancedPricingMock = $this->getAdvancedPricingMock([ + 'retrieveOldSkus', + 'addRowError', + 'saveProductPrices', + 'getCustomerGroupId', + 'getWebSiteId', + ]); + $this->setPropertyValue($advancedPricingMock, '_validatedRows', $validatedRows); + $this->setPropertyValue($advancedPricingMock, '_invalidRows', $invalidRows); + $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); + $this->_validator->expects($this->any())->method('isValid')->willReturn(true); + + $result = $advancedPricingMock->validateRow($rowData, $rowNum); + $this->assertEquals($expectedResult, $result); + } + + /** + * @dataProvider validateRowAddRowErrorCallDataProvider + */ + public function testValidateRowAddRowErrorCall($rowData, $validatedRows, $invalidRows, $oldSkus, $error) + { + $rowNum = 0; + $advancedPricingMock = $this->getAdvancedPricingMock([ + 'retrieveOldSkus', + 'addRowError', + 'saveProductPrices', + 'getCustomerGroupId', + 'getWebSiteId', + ]); + $this->setPropertyValue($advancedPricingMock, '_validatedRows', $validatedRows); + $this->setPropertyValue($advancedPricingMock, '_invalidRows', $invalidRows); + $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); + $this->_validator->expects($this->any())->method('isValid')->willReturn(true); + $advancedPricingMock->expects($this->once())->method('addRowError')->with($error, $rowNum); + + $advancedPricingMock->validateRow($rowData, $rowNum); + } + + public function testValidateRowValidatorCall() + { + $rowNum = 0; + $rowData = [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + ]; + $advancedPricingMock = $this->getAdvancedPricingMock([ + 'retrieveOldSkus', + 'addRowError', + 'saveProductPrices', + 'getCustomerGroupId', + 'getWebSiteId', + ]); + $oldSkus = [ + 'sku value' => 'value', + ]; + $this->setPropertyValue($advancedPricingMock, '_validatedRows', []); + $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); + $this->_validator->expects($this->once())->method('isValid')->willReturn(false); + $messages = ['value']; + $this->_validator->expects($this->once())->method('getMessages')->willReturn($messages); + $advancedPricingMock->expects($this->once())->method('addRowError')->with('value', $rowNum); + + $advancedPricingMock->validateRow($rowData, $rowNum); + } + + public function testSaveAdvancedPricingAddRowErrorCall() + { + $rowNum = 0; + $testBunch = [ + $rowNum => [ + 'bunch', + ] + ]; + $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($testBunch); + $this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(false); + $this->advancedPricing->expects($this->any())->method('saveProductPrices')->will($this->returnSelf()); + + $this->advancedPricing + ->expects($this->once()) + ->method('addRowError') + ->with(\Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); + + $this->advancedPricing->saveAdvancedPricing(); + } + + /** + * @dataProvider saveAdvancedPricingDataProvider + */ + public function testSaveAdvancedPricing($data, $tierCustomerGroupId, $groupCustomerGroupId, $tierWebsiteId, $groupWebsiteId, $expectedTierPrices, $expectedGroupPrices) + { + $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); + $this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(true); + + $this->advancedPricing->expects($this->atLeastOnce())->method('getCustomerGroupId')->willReturnMap([ + [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP], $tierCustomerGroupId], + [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP], $groupCustomerGroupId] + ]); + + $this->advancedPricing->expects($this->atLeastOnce())->method('getWebSiteId')->willReturnMap([ + [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE], $tierWebsiteId], + [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $groupWebsiteId] + ]); + + $this->advancedPricing->expects($this->exactly(2))->method('saveProductPrices')->withConsecutive( + [$expectedTierPrices, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_TIER_PRICE], + [$expectedGroupPrices, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_GROUPED_PRICE] + )->will($this->returnSelf()); + + $this->advancedPricing->saveAdvancedPricing(); + } + + public function testDeleteAdvancedPricingAddRowCall() + { + $rowNum = 0; + $data = [ + $rowNum => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value' + ] + ]; + + $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); + $this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(false); + $this->advancedPricing->expects($this->once())->method('addRowError')->with( + \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_SKU_IS_EMPTY, + $rowNum + )->willReturn(false); + + $this->advancedPricing->deleteAdvancedPricing(); + } + + public function testDeleteAdvancedPricingFormListSkuToDelete() + { + $sku_1 = 'sku value'; + $sku_2 = 'sku value'; + $data = [ + 0 => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => $sku_1 + ], + 1 => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => $sku_2 + ], + ]; + + $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); + $this->advancedPricing->expects($this->any())->method('validateRow')->willReturn(true); + $expectedSkuList = ['sku value']; + $this->advancedPricing->expects($this->exactly(2))->method('deleteProductTierAndGroupPrices')->withConsecutive( + [$expectedSkuList, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_GROUPED_PRICE], + [$expectedSkuList, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_TIER_PRICE] + )->will($this->returnSelf()); + + $this->advancedPricing->deleteAdvancedPricing(); + } + + public function testDeleteAdvancedPricingReset_cachedSkuToDelete() + { + $this->setPropertyValue($this->advancedPricing, '_cachedSkuToDelete', 'some value'); + $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn([]); + + $this->advancedPricing->deleteAdvancedPricing(); + + $_cachedSkuToDelete = $this->getPropertyValue($this->advancedPricing, '_cachedSkuToDelete'); + $this->assertNull($_cachedSkuToDelete); + } + + public function testReplaceAdvancedPricing() + { + $this->markTestSkipped('The method replaceAdvancedPricing is empty'); + } + + public function saveAdvancedPricingDataProvider() + { + return [ + [ + '$data' => [ + 0 => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + //tier + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups ', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + //group + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value - not all groups ', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + ], + ], + '$tierCustomerGroupId' => 'tier customer group id value', + '$groupCustomerGroupId' => 'group customer group id value', + '$tierWebsiteId' => 'tier website id value', + '$groupWebsiteId' => 'group website id value', + '$expectedTierPrices' => [ + 'sku value' => [ + [ + 'all_groups' => false,//$rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS + 'customer_group_id' => 'tier customer group id value',//$tierCustomerGroupId + 'qty' => 'tier price qty value', + 'value' => 'tier price value', + 'website_id' => 'tier website id value', + ], + ], + ], + '$expectedGroupPrices' => [ + 'sku value' => [ + [ + 'all_groups' => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, + 'customer_group_id' => 'group customer group id value',//$groupCustomerGroupId + 'value' => 'group price value', + 'website_id' => 'group website id value', + ], + ], + ], + ], + [// tier customer group is equal to all group + '$data' => [ + 0 => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + //tier + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + //group + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + ], + ], + '$tierCustomerGroupId' => 'tier customer group id value', + '$groupCustomerGroupId' => 'group customer group id value', + '$tierWebsiteId' => 'tier website id value', + '$groupWebsiteId' => 'group website id value', + '$expectedTierPrices' => [ + 'sku value' => [ + [ + 'all_groups' => true,//$rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS + 'customer_group_id' => 'tier customer group id value',//$tierCustomerGroupId + 'qty' => 'tier price qty value', + 'value' => 'tier price value', + 'website_id' => 'tier website id value', + ], + ], + ], + '$expectedGroupPrices' => [ + 'sku value' => [ + [ + 'all_groups' => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, + 'customer_group_id' => 'group customer group id value',//$groupCustomerGroupId + 'value' => 'group price value', + 'website_id' => 'group website id value', + ], + ], + ], + ], + [ + '$data' => [ + 0 => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + //tier + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + //group + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + ], + ], + '$tierCustomerGroupId' => 'tier customer group id value', + '$groupCustomerGroupId' => 'group customer group id value', + '$tierWebsiteId' => 'tier website id value', + '$groupWebsiteId' => 'group website id value', + '$expectedTierPrices' => [], + '$expectedGroupPrices' => [ + 'sku value' => [ + [ + 'all_groups' => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, + 'customer_group_id' => 'group customer group id value',//$groupCustomerGroupId + 'value' => 'group price value', + 'website_id' => 'group website id value', + ], + ], + ], + ], + [ + '$data' => [ + 0 => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + //tier + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + //group + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + ], + ], + '$tierCustomerGroupId' => 'tier customer group id value', + '$groupCustomerGroupId' => 'group customer group id value', + '$tierWebsiteId' => 'tier website id value', + '$groupWebsiteId' => 'group website id value', + '$expectedTierPrices' => [ + 'sku value' => [ + [ + 'all_groups' => false,//$rowData[self::COL_TIER_PRICE_CUSTOMER_GROUP] == self::VALUE_ALL_GROUPS + 'customer_group_id' => 'tier customer group id value',//$tierCustomerGroupId + 'qty' => 'tier price qty value', + 'value' => 'tier price value', + 'website_id' => 'tier website id value', + ], + ] + ], + '$expectedGroupPrices' => [], + ], + ]; + } + + public function validateRowResultDataProvider() + { + return [ + [ + '$rowData' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + ], + '$validatedRows' => [ + 0 => ['value'] + ], + '$invalidRows' => [ + 0 => ['value'] + ], + '$oldSkus' => ['sku value' => 'value'], + '$expectedResult' => false, + ], + [ + '$rowData' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + ], + '$validatedRows' => [], + '$invalidRows' => [ + 0 => ['value'] + ], + '$oldSkus' => ['sku value' => null], + '$expectedResult' => false, + ], + [ + '$rowData' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + ], + '$validatedRows' => [], + '$invalidRows' => [ + 0 => ['value'] + ], + '$oldSkus' => ['sku value' => 'value'], + '$expectedResult' => false, + ], + [ + '$rowData' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + ], + '$validatedRows' => [], + '$invalidRows' => [], + '$oldSkus' => ['sku value' => 'value'], + '$expectedResult' => true, + ], + ]; + } + + public function validateRowAddRowErrorCallDataProvider() + { + return [ + [ + '$rowData' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + ], + '$validatedRows' => [], + '$invalidRows' => [ + 0 => ['value'] + ], + '$oldSkus' => ['sku value' => null], + '$error' => \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, + ], + [ + '$rowData' => [ + \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => false, + ], + '$validatedRows' => [], + '$invalidRows' => [ + 0 => ['value'] + ], + '$oldSkus' => [0 => 'value'], + '$error' => \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_ROW_IS_ORPHAN, + ], + ]; + } + + /** + * Get any object property value. + * + * @param $object + * @param $property + */ + protected function getPropertyValue($object, $property) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + + return $reflectionProperty->getValue($object); + } + + /** + * Set object property value. + * + * @param $object + * @param $property + * @param $value + */ + protected function setPropertyValue(&$object, $property, $value) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($object, $value); + + return $object; + } + + /** + * Get AdvancedPricing Mock object with predefined methods. + * + * @param array $methods + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function getAdvancedPricingMock($methods = array()) + { + return $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing', + $methods, + [ + $this->jsonHelper, + $this->_importExportData, + $this->_resourceHelper, + $this->_dataSourceModel, + $this->_resource, + $this->_resourceFactory, + $this->_productModel, + $this->_catalogData, + $this->_storeResolver, + $this->_importProduct, + $this->_validator, + $this->websiteValidator, + $this->groupPriceValidator, + ], + '' + ); + } +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php new file mode 100644 index 00000000000..a329110031d --- /dev/null +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php @@ -0,0 +1,49 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Indexer\Product\Price\Plugin; + +class ImportTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Indexer\Model\IndexerInterface |\PHPUnit_Framework_MockObject_MockObject + */ + protected $indexer; + + /** + * @var \Magento\AdvancedPricingImportExport\Model\Indexer\Product\Price\Plugin\Import |\PHPUnit_Framework_MockObject_MockObject + */ + protected $import; + + public function setUp() + { + $this->indexer = $this->getMockForAbstractClass('\Magento\Indexer\Model\IndexerInterface', [], '', false); + $this->import = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Indexer\Product\Price\Plugin\Import', + ['getPriceIndexer', 'invalidateIndexer'], + [], + '', + false + ); + $this->import->expects($this->any())->method('getPriceIndexer')->willReturn($this->indexer); + } + + public function testAfterSaveAdvancedPricing() + { + $this->indexer->expects($this->once())->method('isScheduled')->willReturn(false); + $this->import->expects($this->once())->method('invalidateIndexer'); + + $this->import->afterSaveAdvancedPricing(); + } + + public function testAfterDeleteAdvancedPricing() + { + $this->indexer->expects($this->once())->method('isScheduled')->willReturn(false); + $this->import->expects($this->once())->method('invalidateIndexer'); + + $this->import->afterSaveAdvancedPricing(); + } +} -- GitLab From 762f6768d383437f81fa81c63dcb7016ecbabc6f Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Mon, 1 Jun 2015 18:30:48 +0300 Subject: [PATCH 217/396] MAGNIMEX-14: Downloading sample file - fix --- .../Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php index 5e3bb74aa96..7ce27717106 100644 --- a/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php +++ b/app/code/Magento/ImportExport/Block/Adminhtml/Import/Edit/Form.php @@ -183,7 +183,7 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic */ protected function getDownloadSampleFileHtml() { - $html = '<span id="sample-file-span" style="display: none;"><a id="sample-file-link" href="#">' + $html = '<span id="sample-file-span" class="no-display"><a id="sample-file-link" href="#">' . __('Download Sample File') . '</a></span>'; return $html; -- GitLab From 2b10a21ce6bd43c890ae3ab1b433bdfa94e10163 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Mon, 1 Jun 2015 17:44:29 +0000 Subject: [PATCH 218/396] MAGNIMEX-185: Unit tests - Fixed code styles --- .../Validator/GroupPriceTest.php | 94 ++++-- .../Validator/TierPriceTest.php | 168 ++++++---- .../AdvancedPricing/Validator/WebsiteTest.php | 131 ++++---- .../Import/AdvancedPricing/ValidatorTest.php | 16 +- .../Unit/Model/Import/AdvancedPricingTest.php | 301 +++++++++++------- .../Product/Price/Plugin/ImportTest.php | 4 +- 6 files changed, 442 insertions(+), 272 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php index 20e15309f08..a3ec0528183 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/GroupPriceTest.php @@ -6,6 +6,11 @@ namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing\Validator; +use \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing as AdvancedPricing; + +/** + * @SuppressWarnings(PHPMD) + */ class GroupPriceTest extends \PHPUnit_Framework_TestCase { @@ -25,7 +30,7 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase protected $storeResolver; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice|\PHPUnit_Framework_MockObject_MockObject + * @var AdvancedPricing\Validator\GroupPrice|\PHPUnit_Framework_MockObject_MockObject */ protected $groupPrice; @@ -66,8 +71,17 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase { $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); - $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); - $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + $groupSearchResult = $this->getMockForAbstractClass( + '\Magento\Customer\Api\Data\GroupSearchResultsInterface', + [], + '', + false + ); + $this->groupRepository + ->expects($this->once()) + ->method('getList') + ->with($searchCriteria) + ->willReturn($groupSearchResult); $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') ->disableOriginalConstructor() @@ -85,8 +99,17 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase { $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); - $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); - $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + $groupSearchResult = $this->getMockForAbstractClass( + '\Magento\Customer\Api\Data\GroupSearchResultsInterface', + [], + '', + false + ); + $this->groupRepository + ->expects($this->once()) + ->method('getList') + ->with($searchCriteria) + ->willReturn($groupSearchResult); $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') ->disableOriginalConstructor() @@ -128,6 +151,10 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase /** * @dataProvider isValidResultFalseDataProvider + * + * @param array $value + * @param array $hasEmptyColumns + * @param array $customerGroups */ public function testIsValidResultFalse($value, $hasEmptyColumns, $customerGroups) { @@ -149,9 +176,14 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider isValid_addMessagesCallDataProvider + * @dataProvider isValidAddMessagesCallDataProvider + * + * @param array $value + * @param bool $hasEmptyColumns + * @param array $customerGroups + * @param array $expectedMessages */ - public function testIsValid_addMessagesCall($value, $hasEmptyColumns, $customerGroups, $expectedMessages) + public function testIsValidAddMessagesCall($value, $hasEmptyColumns, $customerGroups, $expectedMessages) { $this->groupPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(true); $this->groupPrice->expects($this->any())->method('hasEmptyColumns')->willReturn($hasEmptyColumns); @@ -182,11 +214,11 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase public function isValidResultFalseDataProvider() { return [ - //first if condition cases + // First if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -195,8 +227,8 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => null, + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => null, ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -205,19 +237,19 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', ], '$hasEmptyColumns' => true, '$customerGroups' => [ 'value' => 'value' ], ], - //second if condition cases + // Second if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS, + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => AdvancedPricing::VALUE_ALL_GROUPS, ], '$hasEmptyColumns' => false, '$customerGroups' => [ @@ -226,8 +258,8 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer value', ], '$hasEmptyColumns' => false, '$customerGroups' => [ @@ -237,34 +269,34 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase ]; } - public function isValid_addMessagesCallDataProvider() + public function isValidAddMessagesCallDataProvider() { return [ - //first if condition cases + // First if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS => 'value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::VALUE_ALL_GROUPS => 'value', ], '$hasEmptyColumns' => null, '$customerGroups' => [ 'value' => 'value' ], - '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_GROUP_PRICE_DATA_INCOMPLETE], + '$expectedMessages' => [AdvancedPricing\Validator::ERROR_GROUP_PRICE_DATA_INCOMPLETE], ], - //second if condition cases + // Second if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS => 'not ALL GROUPS', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::VALUE_ALL_GROUPS => 'not ALL GROUPS', ], '$hasEmptyColumns' => false, '$customerGroups' => [ 'value' => null ], - '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_INVALID_GROUP_PRICE_GROUP], + '$expectedMessages' => [AdvancedPricing\Validator::ERROR_INVALID_GROUP_PRICE_GROUP], ], ]; } @@ -300,4 +332,4 @@ class GroupPriceTest extends \PHPUnit_Framework_TestCase return $object; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php index 1b61d339f0a..313c038c2c9 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/TierPriceTest.php @@ -6,10 +6,13 @@ namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing\Validator; +use \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing as AdvancedPricing; + +/** + * @SuppressWarnings(PHPMD) + */ class TierPriceTest extends \PHPUnit_Framework_TestCase { - - /** * @var \Magento\Customer\Api\GroupRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject */ @@ -26,7 +29,7 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase protected $storeResolver; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\TierPrice|\PHPUnit_Framework_MockObject_MockObject + * @var AdvancedPricing\Validator\TierPrice|\PHPUnit_Framework_MockObject_MockObject */ protected $tierPrice; @@ -69,8 +72,17 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase { $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); - $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); - $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + $groupSearchResult = $this->getMockForAbstractClass( + '\Magento\Customer\Api\Data\GroupSearchResultsInterface', + [], + '', + false + ); + $this->groupRepository + ->expects($this->once()) + ->method('getList') + ->with($searchCriteria) + ->willReturn($groupSearchResult); $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') ->disableOriginalConstructor() @@ -88,8 +100,17 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase { $searchCriteria = $this->getMock('Magento\Framework\Api\SearchCriteria', [], [], '', false); $this->searchCriteriaBuilder->expects($this->once())->method('create')->willReturn($searchCriteria); - $groupSearchResult = $this->getMockForAbstractClass('\Magento\Customer\Api\Data\GroupSearchResultsInterface', [], '', false); - $this->groupRepository->expects($this->once())->method('getList')->with($searchCriteria)->willReturn($groupSearchResult); + $groupSearchResult = $this->getMockForAbstractClass( + '\Magento\Customer\Api\Data\GroupSearchResultsInterface', + [], + '', + false + ); + $this->groupRepository + ->expects($this->once()) + ->method('getList') + ->with($searchCriteria) + ->willReturn($groupSearchResult); $groupTest = $this->getMockBuilder('\Magento\Customer\Api\Data\GroupInterface') ->disableOriginalConstructor() @@ -131,6 +152,10 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase /** * @dataProvider isValidResultFalseDataProvider + * + * @param array $value + * @param bool $hasEmptyColumns + * @param array $customerGroups */ public function testIsValidResultFalse($value, $hasEmptyColumns, $customerGroups) { @@ -152,9 +177,14 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase } /** - * @dataProvider isValid_addMessagesCallDataProvider + * @dataProvider isValidAddMessagesCallDataProvider + * + * @param array $value + * @param bool $hasEmptyColumns + * @param array $customerGroups + * @param array $expectedMessages */ - public function testIsValid_addMessagesCall($value, $hasEmptyColumns, $customerGroups, $expectedMessages) + public function testIsValidAddMessagesCall($value, $hasEmptyColumns, $customerGroups, $expectedMessages) { $this->tierPrice->expects($this->once())->method('isValidValueAndLength')->willReturn(true); $this->tierPrice->expects($this->any())->method('hasEmptyColumns')->willReturn($hasEmptyColumns); @@ -167,13 +197,13 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase public function isValidResultFalseDataProvider() { return [ - //first if condition cases + // First if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -182,10 +212,10 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => null, + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -194,10 +224,10 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => null, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -206,10 +236,10 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => null, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => null, ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -218,36 +248,36 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => true, '$customerGroups' => [ 'value' => 'value' ], ], - //second if condition cases + // Second if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'not ALL GROUPS', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'not ALL GROUPS', + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ 'value' => 'value' ], ], - //third if condition cases + // Third if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => -1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => -1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -256,10 +286,10 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => -1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => -1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ @@ -269,50 +299,50 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase ]; } - public function isValid_addMessagesCallDataProvider() + public function isValidAddMessagesCallDataProvider() { return [ - //first if condition cases + // First if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ 'value' => 'value' ], - '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_TIER_DATA_INCOMPLETE], + '$expectedMessages' => [AdvancedPricing\Validator::ERROR_TIER_DATA_INCOMPLETE], ], - //second if condition cases + // Second if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'not ALL GROUPS', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'not ALL GROUPS', + AdvancedPricing::COL_TIER_PRICE_QTY => 1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ 'value' => 'value' ], - '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_INVALID_TIER_PRICE_GROUP], + '$expectedMessages' => [AdvancedPricing\Validator::ERROR_INVALID_TIER_PRICE_GROUP], ], - //third if condition cases + // Third if condition cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => -1000, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 1000, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'value', + AdvancedPricing::COL_TIER_PRICE_QTY => -1000, + AdvancedPricing::COL_TIER_PRICE => 1000, ], '$hasEmptyColumns' => null, '$customerGroups' => [ 'value' => 'value' ], - '$expectedMessages' => [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator::ERROR_INVALID_TIER_PRICE_QTY], + '$expectedMessages' => [AdvancedPricing\Validator::ERROR_INVALID_TIER_PRICE_QTY], ], ]; } @@ -320,8 +350,8 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase /** * Get any object property value. * - * @param $object - * @param $property + * @param object $object + * @param string $property */ protected function getPropertyValue($object, $property) { @@ -335,9 +365,9 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase /** * Set object property value. * - * @param $object - * @param $property - * @param $value + * @param object $object + * @param string $property + * @param mixed $value */ protected function setPropertyValue(&$object, $property, $value) { @@ -348,4 +378,4 @@ class TierPriceTest extends \PHPUnit_Framework_TestCase return $object; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php index 56b8962b1fc..54045bbec6a 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/Validator/WebsiteTest.php @@ -6,6 +6,8 @@ namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing\Validator; +use \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing as AdvancedPricing; + class WebsiteTest extends \PHPUnit_Framework_TestCase { /** @@ -19,7 +21,7 @@ class WebsiteTest extends \PHPUnit_Framework_TestCase protected $storeResolver; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website|\PHPUnit_Framework_MockObject_MockObject + * @var AdvancedPricing\Validator\Website|\PHPUnit_Framework_MockObject_MockObject */ protected $website; @@ -60,40 +62,51 @@ class WebsiteTest extends \PHPUnit_Framework_TestCase /** * @dataProvider isValidReturnDataProvider + * + * @param array $value + * @param string $allWebsitesValue + * @param string $colTierPriceWebsite + * @param string $colGroupPriceWebsite + * @param bool $expectedResult */ - public function testIsValidReturn($value, $allWebsitesValue, $allWebsitesValueColTierPriceWebsite, $allWebsitesValueColGroupPriceWebsite, $expectedResult) - { + public function testIsValidReturn( + $value, + $allWebsites, + $colTierPriceWebsite, + $colGroupPriceWebsite, + $expectedResult + ) { $this->website->expects($this->once())->method('_clearMessages'); - $this->website->expects($this->atLeastOnce())->method('getAllWebsitesValue')->willReturn($allWebsitesValue); + $this->website->expects($this->atLeastOnce())->method('getAllWebsitesValue')->willReturn($allWebsites); $this->storeResolver->method('getWebsiteCodeToId')->willReturnMap([ - [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE], $allWebsitesValueColTierPriceWebsite], - [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $allWebsitesValueColGroupPriceWebsite], + [$value[AdvancedPricing::COL_TIER_PRICE_WEBSITE], $colTierPriceWebsite], + [$value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $colGroupPriceWebsite], ]); $result = $this->website->isValid($value); $this->assertEquals($expectedResult, $result); } - public function testIsValidReturn_addMessagesCall() + public function testIsValidReturnAddMessagesCall() { $value = [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ]; $allWebsitesValue = 'not tier|group price website value'; - $allWebsitesValueColTierPriceWebsite = false; - $allWebsitesValueColGroupPriceWebsite = 'value'; - $expectedMessages = [\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website::ERROR_INVALID_WEBSITE]; + $colTierPriceWebsite = false; + $colGroupPriceWebsite = 'value'; + $expectedMessages = [AdvancedPricing\Validator\Website::ERROR_INVALID_WEBSITE]; $this->website->expects($this->once())->method('_clearMessages'); $this->website->expects($this->atLeastOnce())->method('getAllWebsitesValue')->willReturn($allWebsitesValue); $this->storeResolver->method('getWebsiteCodeToId')->willReturnMap([ - [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE], $allWebsitesValueColTierPriceWebsite], - [$value[\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $allWebsitesValueColGroupPriceWebsite], + [$value[AdvancedPricing::COL_TIER_PRICE_WEBSITE], $colTierPriceWebsite], + [$value[AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $colGroupPriceWebsite], ]); $this->website->expects($this->once())->method('_addMessages')->with($expectedMessages); - $result = $this->website->isValid($value); + $this->website->isValid($value); } public function testGetAllWebsitesValue() @@ -104,7 +117,7 @@ class WebsiteTest extends \PHPUnit_Framework_TestCase $this->webSiteModel->expects($this->once())->method('getBaseCurrency')->willReturn($currency); - $expectedResult = \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_WEBSITES . ' [' . $currencyCode . ']'; + $expectedResult = AdvancedPricing::VALUE_ALL_WEBSITES . ' [' . $currencyCode . ']'; $website = $this->getMock( '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website', @@ -123,88 +136,88 @@ class WebsiteTest extends \PHPUnit_Framework_TestCase public function isValidReturnDataProvider() { return [ - //false cases + // False cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ], - '$allWebsitesValue' => 'not tier|group price website value', - '$allWebsitesValueColTierPriceWebsite' => false, - '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$allWebsites' => 'not tier|group price website value', + '$colTierPriceWebsite' => false, + '$colGroupPriceWebsite' => 'value', '$expectedResult' => false, ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ], - '$allWebsitesValue' => 'not tier|group price website value', - '$allWebsitesValueColTierPriceWebsite' => 'value', - '$allWebsitesValueColGroupPriceWebsite' => false, + '$allWebsites' => 'not tier|group price website value', + '$colTierPriceWebsite' => 'value', + '$colGroupPriceWebsite' => false, '$expectedResult' => false, ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ], - '$allWebsitesValue' => 'not tier|group price website value', - '$allWebsitesValueColTierPriceWebsite' => 'value', - '$allWebsitesValueColGroupPriceWebsite' => false, + '$allWebsites' => 'not tier|group price website value', + '$colTierPriceWebsite' => 'value', + '$colGroupPriceWebsite' => false, '$expectedResult' => false, ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => false, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => false, + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ], - '$allWebsitesValue' => 'not tier|group price website value', - '$allWebsitesValueColTierPriceWebsite' => 'value', - '$allWebsitesValueColGroupPriceWebsite' => false, + '$allWebsites' => 'not tier|group price website value', + '$colTierPriceWebsite' => 'value', + '$colGroupPriceWebsite' => false, '$expectedResult' => false, ], - //true cases + // True cases. [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ], - '$allWebsitesValue' => 'tier value', - '$allWebsitesValueColTierPriceWebsite' => 'value', - '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$allWebsites' => 'tier value', + '$colTierPriceWebsite' => 'value', + '$colGroupPriceWebsite' => 'value', '$expectedResult' => true, ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ], - '$allWebsitesValue' => 'group value', - '$allWebsitesValueColTierPriceWebsite' => 'value', - '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$allWebsites' => 'group value', + '$colTierPriceWebsite' => 'value', + '$colGroupPriceWebsite' => 'value', '$expectedResult' => true, ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => false, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => false, + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group value', ], - '$allWebsitesValue' => 'not tier|group price website value', - '$allWebsitesValueColTierPriceWebsite' => 'value', - '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$allWebsites' => 'not tier|group price website value', + '$colTierPriceWebsite' => 'value', + '$colGroupPriceWebsite' => 'value', '$expectedResult' => true, ], [ '$value' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => false, + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => false, ], - '$allWebsitesValue' => 'not tier|group price website value', - '$allWebsitesValueColTierPriceWebsite' => 'value', - '$allWebsitesValueColGroupPriceWebsite' => 'value', + '$allWebsites' => 'not tier|group price website value', + '$colTierPriceWebsite' => 'value', + '$colGroupPriceWebsite' => 'value', '$expectedResult' => true, ], ]; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php index 1b84bcecfd5..07033bb6752 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricing/ValidatorTest.php @@ -5,20 +5,23 @@ */ namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import\AdvancedPricing; +use \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator as Validator; +use \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as RowValidatorInterface; + class ValidatorTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator |\PHPUnit_Framework_MockObject_MockObject + * @var Validator |\PHPUnit_Framework_MockObject_MockObject */ protected $validator; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator |\PHPUnit_Framework_MockObject_MockObject + * @var Validator |\PHPUnit_Framework_MockObject_MockObject */ protected $validators; /** - * @var \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface |\PHPUnit_Framework_MockObject_MockObject + * @var RowValidatorInterface |\PHPUnit_Framework_MockObject_MockObject */ protected $validatorTest; @@ -43,6 +46,9 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase /** * @dataProvider isValidDataProvider + * + * @param array $validatorResult + * @param bool $expectedResult */ public function testIsValid($validatorResult, $expectedResult) { @@ -54,7 +60,7 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase $this->assertEquals($expectedResult, $result); } - public function testIsValid_addMessagesCall() + public function testIsValidAddMessagesCall() { $value = 'value'; $this->validatorTest->expects($this->once())->method('isValid')->willReturn(false); @@ -83,4 +89,4 @@ class ValidatorTest extends \PHPUnit_Framework_TestCase ] ]; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php index 05aa6d03e9d..10f1c8fe3ac 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php @@ -6,84 +6,109 @@ namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Import; +use \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing as AdvancedPricing; +use \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory as ResourceFactory; +use \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as RowValidatorInterface; + +/** + * @SuppressWarnings(PHPMD) + */ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory |\PHPUnit_Framework_MockObject_MockObject + * @var ResourceFactory |\PHPUnit_Framework_MockObject_MockObject */ - protected $_resourceFactory; + protected $resourceFactory; /** * @var \Magento\Catalog\Helper\Data |\PHPUnit_Framework_MockObject_MockObject */ - protected $_catalogData; + protected $catalogData; /** * @var \Magento\Catalog\Model\Product |\PHPUnit_Framework_MockObject_MockObject */ - protected $_productModel; + protected $productModel; /** * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver |\PHPUnit_Framework_MockObject_MockObject */ - protected $_storeResolver; + protected $storeResolver; /** * @var \Magento\CatalogImportExport\Model\Import\Product|PHPUnit_Framework_MockObject_MockObject */ - protected $_importProduct; + protected $importProduct; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator |\PHPUnit_Framework_MockObject_MockObject + * @var AdvancedPricing\Validator |\PHPUnit_Framework_MockObject_MockObject */ - protected $_validator; + protected $validator; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website |\PHPUnit_Framework_MockObject_MockObject + * @var AdvancedPricing\Validator\Website |\PHPUnit_Framework_MockObject_MockObject */ protected $websiteValidator; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice |\PHPUnit_Framework_MockObject_MockObject + * @var AdvancedPricing\Validator\GroupPrice |\PHPUnit_Framework_MockObject_MockObject */ protected $groupPriceValidator; /** * @var \Magento\ImportExport\Model\Resource\Helper |\PHPUnit_Framework_MockObject_MockObject */ - protected $_resourceHelper; + protected $resourceHelper; /** * @var \Magento\Framework\DB\Adapter\AdapterInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $_connection; + protected $connection; /** * @var \Magento\ImportExport\Model\Resource\Import\Data|\PHPUnit_Framework_MockObject_MockObject */ - protected $_dataSourceModel; + protected $dataSourceModel; /** * @var array */ - protected $_cachedSkuToDelete; + protected $cachedSkuToDelete; /** * @var array */ - protected $_oldSkus; + protected $oldSkus; /** - * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing |\PHPUnit_Framework_MockObject_MockObject + * @var AdvancedPricing |\PHPUnit_Framework_MockObject_MockObject */ protected $advancedPricing; public function setUp() { - $this->jsonHelper = $this->getMock('\Magento\Framework\Json\Helper\Data', [], [], '', false); - $this->_importExportData = $this->getMock('\Magento\ImportExport\Helper\Data', [], [], '', false); - $this->_resourceHelper = $this->getMock('\Magento\ImportExport\Model\Resource\Helper', [], [], '', false); + $this->jsonHelper = $this->getMock( + '\Magento\Framework\Json\Helper\Data', + [], + [], + '', + false + ); + $this->_importExportData = $this->getMock( + '\Magento\ImportExport\Helper\Data', + [], + [], + '', + false + ); + $this->resourceHelper = $this->getMock( + '\Magento\ImportExport\Model\Resource\Helper', + [], + [], + '', + false + ); $this->_resource = $this->getMock( '\Magento\Framework\App\Resource', ['getConnection'], @@ -91,23 +116,76 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '', false ); - $this->_connection = $this->getMockForAbstractClass('\Magento\Framework\DB\Adapter\AdapterInterface', [], '', false); - $this->_resource->expects($this->any())->method('getConnection')->willReturn($this->_connection); - $this->_dataSourceModel = $this->getMock('\Magento\ImportExport\Model\Resource\Import\Data', [], [], '', false); - $this->_resourceFactory = $this->getMock('\Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory', [], [], '', false); - $this->_productModel = $this->getMock('\Magento\Catalog\Model\Product', [], [], '', false); - $this->_catalogData = $this->getMock('\Magento\Catalog\Helper\Data', [], [], '', false); - $this->_storeResolver = $this->getMock('\Magento\CatalogImportExport\Model\Import\Product\StoreResolver', [], [], '', false); - $this->_importProduct = $this->getMock('\Magento\CatalogImportExport\Model\Import\Product', [], [], '', false); - $this->_validator = $this->getMock( + $this->connection = $this->getMockForAbstractClass( + '\Magento\Framework\DB\Adapter\AdapterInterface', + [], + '', + false + ); + $this->_resource->expects($this->any())->method('getConnection')->willReturn($this->connection); + $this->dataSourceModel = $this->getMock( + '\Magento\ImportExport\Model\Resource\Import\Data', + [], + [], + '', + false + ); + $this->resourceFactory = $this->getMock( + '\Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory', + [], + [], + '', + false + ); + $this->productModel = $this->getMock( + '\Magento\Catalog\Model\Product', + [], + [], + '', + false + ); + $this->catalogData = $this->getMock( + '\Magento\Catalog\Helper\Data', + [], + [], + '', + false + ); + $this->storeResolver = $this->getMock( + '\Magento\CatalogImportExport\Model\Import\Product\StoreResolver', + [], + [], + '', + false + ); + $this->importProduct = $this->getMock( + '\Magento\CatalogImportExport\Model\Import\Product', + [], + [], + '', + false + ); + $this->validator = $this->getMock( '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator', ['isValid', 'getMessages'], [], '', false ); - $this->websiteValidator = $this->getMock('\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website', [], [], '', false); - $this->groupPriceValidator = $this->getMock('\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice', [], [], '', false); + $this->websiteValidator = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\Website', + [], + [], + '', + false + ); + $this->groupPriceValidator = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator\GroupPrice', + [], + [], + '', + false + ); $this->advancedPricing = $this->getAdvancedPricingMock([ 'retrieveOldSkus', @@ -146,7 +224,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase $this->setPropertyValue($advancedPricingMock, '_validatedRows', $validatedRows); $this->setPropertyValue($advancedPricingMock, '_invalidRows', $invalidRows); $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); - $this->_validator->expects($this->any())->method('isValid')->willReturn(true); + $this->validator->expects($this->any())->method('isValid')->willReturn(true); $result = $advancedPricingMock->validateRow($rowData, $rowNum); $this->assertEquals($expectedResult, $result); @@ -168,7 +246,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase $this->setPropertyValue($advancedPricingMock, '_validatedRows', $validatedRows); $this->setPropertyValue($advancedPricingMock, '_invalidRows', $invalidRows); $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); - $this->_validator->expects($this->any())->method('isValid')->willReturn(true); + $this->validator->expects($this->any())->method('isValid')->willReturn(true); $advancedPricingMock->expects($this->once())->method('addRowError')->with($error, $rowNum); $advancedPricingMock->validateRow($rowData, $rowNum); @@ -192,9 +270,9 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase ]; $this->setPropertyValue($advancedPricingMock, '_validatedRows', []); $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); - $this->_validator->expects($this->once())->method('isValid')->willReturn(false); + $this->validator->expects($this->once())->method('isValid')->willReturn(false); $messages = ['value']; - $this->_validator->expects($this->once())->method('getMessages')->willReturn($messages); + $this->validator->expects($this->once())->method('getMessages')->willReturn($messages); $advancedPricingMock->expects($this->once())->method('addRowError')->with('value', $rowNum); $advancedPricingMock->validateRow($rowData, $rowNum); @@ -208,14 +286,14 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase 'bunch', ] ]; - $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($testBunch); + $this->dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($testBunch); $this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(false); $this->advancedPricing->expects($this->any())->method('saveProductPrices')->will($this->returnSelf()); $this->advancedPricing ->expects($this->once()) ->method('addRowError') - ->with(\Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); + ->with(RowValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); $this->advancedPricing->saveAdvancedPricing(); } @@ -223,24 +301,31 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase /** * @dataProvider saveAdvancedPricingDataProvider */ - public function testSaveAdvancedPricing($data, $tierCustomerGroupId, $groupCustomerGroupId, $tierWebsiteId, $groupWebsiteId, $expectedTierPrices, $expectedGroupPrices) - { - $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); + public function testSaveAdvancedPricing( + $data, + $tierCustomerGroupId, + $groupCustomerGroupId, + $tierWebsiteId, + $groupWebsiteId, + $expectedTierPrices, + $expectedGroupPrices + ) { + $this->dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); $this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(true); $this->advancedPricing->expects($this->atLeastOnce())->method('getCustomerGroupId')->willReturnMap([ - [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP], $tierCustomerGroupId], - [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP], $groupCustomerGroupId] + [$data[0][AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP], $tierCustomerGroupId], + [$data[0][AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP], $groupCustomerGroupId] ]); $this->advancedPricing->expects($this->atLeastOnce())->method('getWebSiteId')->willReturnMap([ - [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE], $tierWebsiteId], - [$data[0][\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $groupWebsiteId] + [$data[0][AdvancedPricing::COL_TIER_PRICE_WEBSITE], $tierWebsiteId], + [$data[0][AdvancedPricing::COL_GROUP_PRICE_WEBSITE], $groupWebsiteId] ]); $this->advancedPricing->expects($this->exactly(2))->method('saveProductPrices')->withConsecutive( - [$expectedTierPrices, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_TIER_PRICE], - [$expectedGroupPrices, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_GROUPED_PRICE] + [$expectedTierPrices, AdvancedPricing::TABLE_TIER_PRICE], + [$expectedGroupPrices, AdvancedPricing::TABLE_GROUPED_PRICE] )->will($this->returnSelf()); $this->advancedPricing->saveAdvancedPricing(); @@ -251,11 +336,11 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase $rowNum = 0; $data = [ $rowNum => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value' + AdvancedPricing::COL_SKU => 'sku value' ] ]; - $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); + $this->dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); $this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(false); $this->advancedPricing->expects($this->once())->method('addRowError')->with( \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_SKU_IS_EMPTY, @@ -271,33 +356,33 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase $sku_2 = 'sku value'; $data = [ 0 => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => $sku_1 + AdvancedPricing::COL_SKU => $sku_1 ], 1 => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => $sku_2 + AdvancedPricing::COL_SKU => $sku_2 ], ]; - $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); + $this->dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); $this->advancedPricing->expects($this->any())->method('validateRow')->willReturn(true); $expectedSkuList = ['sku value']; $this->advancedPricing->expects($this->exactly(2))->method('deleteProductTierAndGroupPrices')->withConsecutive( - [$expectedSkuList, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_GROUPED_PRICE], - [$expectedSkuList, \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::TABLE_TIER_PRICE] + [$expectedSkuList, AdvancedPricing::TABLE_GROUPED_PRICE], + [$expectedSkuList, AdvancedPricing::TABLE_TIER_PRICE] )->will($this->returnSelf()); $this->advancedPricing->deleteAdvancedPricing(); } - public function testDeleteAdvancedPricingReset_cachedSkuToDelete() + public function testDeleteAdvancedPricingResetCachedSkuToDelete() { $this->setPropertyValue($this->advancedPricing, '_cachedSkuToDelete', 'some value'); - $this->_dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn([]); + $this->dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn([]); $this->advancedPricing->deleteAdvancedPricing(); - $_cachedSkuToDelete = $this->getPropertyValue($this->advancedPricing, '_cachedSkuToDelete'); - $this->assertNull($_cachedSkuToDelete); + $cachedSkuToDelete = $this->getPropertyValue($this->advancedPricing, '_cachedSkuToDelete'); + $this->assertNull($cachedSkuToDelete); } public function testReplaceAdvancedPricing() @@ -307,20 +392,21 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase public function saveAdvancedPricingDataProvider() { + // @codingStandardsIgnoreStart return [ [ '$data' => [ 0 => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', //tier - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups ', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups ', + AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + AdvancedPricing::COL_TIER_PRICE => 'tier price value', //group - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value - not all groups ', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value - not all groups ', + AdvancedPricing::COL_GROUP_PRICE => 'group price value', ], ], '$tierCustomerGroupId' => 'tier customer group id value', @@ -341,7 +427,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '$expectedGroupPrices' => [ 'sku value' => [ [ - 'all_groups' => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, + 'all_groups' => AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, 'customer_group_id' => 'group customer group id value',//$groupCustomerGroupId 'value' => 'group price value', 'website_id' => 'group website id value', @@ -352,16 +438,16 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase [// tier customer group is equal to all group '$data' => [ 0 => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', //tier - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::VALUE_ALL_GROUPS, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => AdvancedPricing::VALUE_ALL_GROUPS, + AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + AdvancedPricing::COL_TIER_PRICE => 'tier price value', //group - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', + AdvancedPricing::COL_GROUP_PRICE => 'group price value', ], ], '$tierCustomerGroupId' => 'tier customer group id value', @@ -382,7 +468,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '$expectedGroupPrices' => [ 'sku value' => [ [ - 'all_groups' => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, + 'all_groups' => AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, 'customer_group_id' => 'group customer group id value',//$groupCustomerGroupId 'value' => 'group price value', 'website_id' => 'group website id value', @@ -393,16 +479,16 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase [ '$data' => [ 0 => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', //tier - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => null, + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups', + AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + AdvancedPricing::COL_TIER_PRICE => 'tier price value', //group - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => 'group price website value', + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', + AdvancedPricing::COL_GROUP_PRICE => 'group price value', ], ], '$tierCustomerGroupId' => 'tier customer group id value', @@ -413,7 +499,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '$expectedGroupPrices' => [ 'sku value' => [ [ - 'all_groups' => \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, + 'all_groups' => AdvancedPricing::DEFAULT_ALL_GROUPS_GROUPED_PRICE_VALUE, 'customer_group_id' => 'group customer group id value',//$groupCustomerGroupId 'value' => 'group price value', 'website_id' => 'group website id value', @@ -424,16 +510,16 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase [ '$data' => [ 0 => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', //tier - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_TIER_PRICE => 'tier price value', + AdvancedPricing::COL_TIER_PRICE_WEBSITE => 'tier price website value', + AdvancedPricing::COL_TIER_PRICE_CUSTOMER_GROUP => 'tier price customer group value - not all groups', + AdvancedPricing::COL_TIER_PRICE_QTY => 'tier price qty value', + AdvancedPricing::COL_TIER_PRICE => 'tier price value', //group - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_GROUP_PRICE => 'group price value', + AdvancedPricing::COL_GROUP_PRICE_WEBSITE => null, + AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP => 'group price customer group value', + AdvancedPricing::COL_GROUP_PRICE => 'group price value', ], ], '$tierCustomerGroupId' => 'tier customer group id value', @@ -454,6 +540,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '$expectedGroupPrices' => [], ], ]; + // @codingStandardsIgnoreEnd } public function validateRowResultDataProvider() @@ -461,7 +548,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase return [ [ '$rowData' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', ], '$validatedRows' => [ 0 => ['value'] @@ -474,7 +561,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase ], [ '$rowData' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', ], '$validatedRows' => [], '$invalidRows' => [ @@ -485,7 +572,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase ], [ '$rowData' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', ], '$validatedRows' => [], '$invalidRows' => [ @@ -496,7 +583,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase ], [ '$rowData' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', ], '$validatedRows' => [], '$invalidRows' => [], @@ -511,25 +598,25 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase return [ [ '$rowData' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => 'sku value', ], '$validatedRows' => [], '$invalidRows' => [ 0 => ['value'] ], '$oldSkus' => ['sku value' => null], - '$error' => \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, + '$error' => RowValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, ], [ '$rowData' => [ - \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing::COL_SKU => false, + AdvancedPricing::COL_SKU => false, ], '$validatedRows' => [], '$invalidRows' => [ 0 => ['value'] ], '$oldSkus' => [0 => 'value'], - '$error' => \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_ROW_IS_ORPHAN, + '$error' => RowValidatorInterface::ERROR_ROW_IS_ORPHAN, ], ]; } @@ -581,15 +668,15 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase [ $this->jsonHelper, $this->_importExportData, - $this->_resourceHelper, - $this->_dataSourceModel, + $this->resourceHelper, + $this->dataSourceModel, $this->_resource, - $this->_resourceFactory, - $this->_productModel, - $this->_catalogData, - $this->_storeResolver, - $this->_importProduct, - $this->_validator, + $this->resourceFactory, + $this->productModel, + $this->catalogData, + $this->storeResolver, + $this->importProduct, + $this->validator, $this->websiteValidator, $this->groupPriceValidator, ], diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php index a329110031d..d715ab11276 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php @@ -6,6 +6,8 @@ namespace Magento\AdvancedPricingImportExport\Test\Unit\Model\Indexer\Product\Price\Plugin; +use \Magento\AdvancedPricingImportExport\Model\Indexer\Product\Price\Plugin\Import as Import; + class ImportTest extends \PHPUnit_Framework_TestCase { /** @@ -14,7 +16,7 @@ class ImportTest extends \PHPUnit_Framework_TestCase protected $indexer; /** - * @var \Magento\AdvancedPricingImportExport\Model\Indexer\Product\Price\Plugin\Import |\PHPUnit_Framework_MockObject_MockObject + * @var Import |\PHPUnit_Framework_MockObject_MockObject */ protected $import; -- GitLab From 3d307c3332a61a136e5b64b6bb23e82358a51fc8 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Mon, 1 Jun 2015 18:12:40 +0000 Subject: [PATCH 219/396] MAGNIMEX-99: revert unit tests fixes for GroupedTest --- .../Model/Import/Product/Type/GroupedTest.php | 55 ------------------- 1 file changed, 55 deletions(-) diff --git a/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php b/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php index d9fcf1530d1..64a39e61c95 100644 --- a/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php +++ b/app/code/Magento/GroupedImportExport/Test/Unit/Model/Import/Product/Type/GroupedTest.php @@ -47,17 +47,6 @@ class GroupedTest extends \PHPUnit_Framework_TestCase */ protected $entityModel; - /** - * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject - */ - protected $resource; - - /** - * @var \Magento\Framework\DB\Adapter\Pdo\Mysql|\PHPUnit_Framework_MockObject_MockObject - */ - protected $connection; - - protected function setUp() { $this->setCollectionFactory = $this->getMock( @@ -88,14 +77,6 @@ class GroupedTest extends \PHPUnit_Framework_TestCase '', false ); - - $attrCollection = $this->getMock('\Magento\Catalog\Model\Resource\Product\Attribute\Collection', [], [], '', false); - $attrCollection->expects($this->any())->method('addFieldToFilter')->willReturn([]); - - $this->attrCollectionFactory->expects($this->any())->method('create')->will( - $this->returnValue($attrCollection) - ); - $this->entityModel = $this->getMock( 'Magento\CatalogImportExport\Model\Import\Product', ['getNewSku', 'getOldSku', 'getNextBunch', 'isRowAllowedToImport', 'getRowScope'], @@ -115,48 +96,12 @@ class GroupedTest extends \PHPUnit_Framework_TestCase false ); - $this->connection = $this->getMock( - 'Magento\Framework\DB\Adapter\Pdo\Mysql', - ['select', 'fetchAll', 'fetchPairs', 'joinLeft', 'insertOnDuplicate', 'delete', 'quoteInto', 'fetchAssoc'], - [], - '', - false - ); - - $select = $this->getMock('Magento\Framework\DB\Select', [], [], '', false); - $select->expects($this->any())->method('from')->will($this->returnSelf()); - $select->expects($this->any())->method('where')->will($this->returnSelf()); - $select->expects($this->any())->method('joinLeft')->will($this->returnSelf()); - $adapter = $this->getMock('Magento\Framework\DB\Adapter\Pdo\Mysql', [], [], '', false); - $adapter->expects($this->any())->method('quoteInto')->will($this->returnValue('query')); - $select->expects($this->any())->method('getAdapter')->willReturn($adapter); - $this->connection->expects($this->any())->method('select')->will($this->returnValue($select)); - $this->connection->expects($this->any())->method('fetchPairs')->will($this->returnValue([ - '1' => '1', '2' => '2' - ])); - - $this->resource = $this->getMock( - 'Magento\Framework\App\Resource', - ['getConnection', 'getTableName'], - [], - '', - false - ); - - $this->resource->expects($this->any())->method('getConnection')->will( - $this->returnValue($this->connection) - ); - $this->resource->expects($this->any())->method('getTableName')->will( - $this->returnValue('tableName') - ); - $this->objectManagerHelper = new ObjectManagerHelper($this); $this->grouped = $this->objectManagerHelper->getObject( 'Magento\GroupedImportExport\Model\Import\Product\Type\Grouped', [ 'attrSetColFac' => $this->setCollectionFactory, 'prodAttrColFac' => $this->attrCollectionFactory, - 'resource' => $this->resource, 'params' => $this->params, 'links' => $this->links ] -- GitLab From f43869d55fb8f8575cf2d6153d714f0d1b09516d Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Mon, 1 Jun 2015 23:46:07 +0300 Subject: [PATCH 220/396] MAGNIMEX-10: Fix validation logic --- .../Model/Import/AdvancedPricing.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 7d467e4a966..a0011c5b526 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -175,9 +175,13 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract return !isset($this->_invalidRows[$rowNum]); } $this->_validatedRows[$rowNum] = true; - if (!isset($this->_oldSkus[$rowData[self::COL_SKU]])) { - $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); - return false; + // BEHAVIOR_DELETE use specific validation logic + if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { + if (!isset($rowData[self::COL_SKU])) { + $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); + return false; + } + return true; } if (!$this->_validator->isValid($rowData)) { foreach ($this->_validator->getMessages() as $message) { @@ -262,12 +266,10 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract $listSku = []; while ($bunch = $this->_dataSourceModel->getNextBunch()) { foreach ($bunch as $rowNum => $rowData) { - if (!$this->validateRow($rowData, $rowNum)) { - $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); - continue; + if ($this->validateRow($rowData, $rowNum)) { + $rowSku = $rowData[self::COL_SKU]; + $listSku[] = $rowSku; } - $rowSku = $rowData[self::COL_SKU]; - $listSku[] = $rowSku; } } if ($listSku) { -- GitLab From bc9ef98f4e48bcbb7ea23ec707ed3514f93bef20 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Mon, 1 Jun 2015 21:43:45 +0000 Subject: [PATCH 221/396] MAGNIMEX-185: Unit tests - Fixed unit tests after AdvancedPricing update --- .../Unit/Model/Import/AdvancedPricingTest.php | 60 ++++++++----------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php index 10f1c8fe3ac..b6d78a000a8 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php @@ -211,7 +211,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase /** * @dataProvider validateRowResultDataProvider */ - public function testValidateRowResult($rowData, $validatedRows, $invalidRows, $oldSkus, $expectedResult) + public function testValidateRowResult($rowData, $validatedRows, $invalidRows, $behavior, $expectedResult) { $rowNum = 0; $advancedPricingMock = $this->getAdvancedPricingMock([ @@ -220,11 +220,12 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase 'saveProductPrices', 'getCustomerGroupId', 'getWebSiteId', + 'getBehavior', ]); $this->setPropertyValue($advancedPricingMock, '_validatedRows', $validatedRows); $this->setPropertyValue($advancedPricingMock, '_invalidRows', $invalidRows); - $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); $this->validator->expects($this->any())->method('isValid')->willReturn(true); + $advancedPricingMock->expects($this->any())->method('getBehavior')->willReturn($behavior); $result = $advancedPricingMock->validateRow($rowData, $rowNum); $this->assertEquals($expectedResult, $result); @@ -233,7 +234,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase /** * @dataProvider validateRowAddRowErrorCallDataProvider */ - public function testValidateRowAddRowErrorCall($rowData, $validatedRows, $invalidRows, $oldSkus, $error) + public function testValidateRowAddRowErrorCall($rowData, $validatedRows, $invalidRows, $behavior, $error) { $rowNum = 0; $advancedPricingMock = $this->getAdvancedPricingMock([ @@ -242,11 +243,12 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase 'saveProductPrices', 'getCustomerGroupId', 'getWebSiteId', + 'getBehavior', ]); $this->setPropertyValue($advancedPricingMock, '_validatedRows', $validatedRows); $this->setPropertyValue($advancedPricingMock, '_invalidRows', $invalidRows); - $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); $this->validator->expects($this->any())->method('isValid')->willReturn(true); + $advancedPricingMock->expects($this->any())->method('getBehavior')->willReturn($behavior); $advancedPricingMock->expects($this->once())->method('addRowError')->with($error, $rowNum); $advancedPricingMock->validateRow($rowData, $rowNum); @@ -265,11 +267,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase 'getCustomerGroupId', 'getWebSiteId', ]); - $oldSkus = [ - 'sku value' => 'value', - ]; $this->setPropertyValue($advancedPricingMock, '_validatedRows', []); - $this->setPropertyValue($advancedPricingMock, '_oldSkus', $oldSkus); $this->validator->expects($this->once())->method('isValid')->willReturn(false); $messages = ['value']; $this->validator->expects($this->once())->method('getMessages')->willReturn($messages); @@ -331,25 +329,6 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase $this->advancedPricing->saveAdvancedPricing(); } - public function testDeleteAdvancedPricingAddRowCall() - { - $rowNum = 0; - $data = [ - $rowNum => [ - AdvancedPricing::COL_SKU => 'sku value' - ] - ]; - - $this->dataSourceModel->expects($this->at(0))->method('getNextBunch')->willReturn($data); - $this->advancedPricing->expects($this->once())->method('validateRow')->willReturn(false); - $this->advancedPricing->expects($this->once())->method('addRowError')->with( - \Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface::ERROR_SKU_IS_EMPTY, - $rowNum - )->willReturn(false); - - $this->advancedPricing->deleteAdvancedPricing(); - } - public function testDeleteAdvancedPricingFormListSkuToDelete() { $sku_1 = 'sku value'; @@ -556,18 +535,18 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '$invalidRows' => [ 0 => ['value'] ], - '$oldSkus' => ['sku value' => 'value'], + '$behavior' => null, '$expectedResult' => false, ], [ '$rowData' => [ - AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => null, ], '$validatedRows' => [], '$invalidRows' => [ 0 => ['value'] ], - '$oldSkus' => ['sku value' => null], + '$behavior' => \Magento\ImportExport\Model\Import::BEHAVIOR_DELETE, '$expectedResult' => false, ], [ @@ -578,7 +557,18 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '$invalidRows' => [ 0 => ['value'] ], - '$oldSkus' => ['sku value' => 'value'], + '$behavior' => \Magento\ImportExport\Model\Import::BEHAVIOR_DELETE, + '$expectedResult' => true, + ], + [ + '$rowData' => [ + AdvancedPricing::COL_SKU => 'sku value', + ], + '$validatedRows' => [], + '$invalidRows' => [ + 0 => ['value'] + ], + '$behavior' => null, '$expectedResult' => false, ], [ @@ -587,7 +577,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase ], '$validatedRows' => [], '$invalidRows' => [], - '$oldSkus' => ['sku value' => 'value'], + '$behavior' => null, '$expectedResult' => true, ], ]; @@ -598,13 +588,13 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase return [ [ '$rowData' => [ - AdvancedPricing::COL_SKU => 'sku value', + AdvancedPricing::COL_SKU => null, ], '$validatedRows' => [], '$invalidRows' => [ 0 => ['value'] ], - '$oldSkus' => ['sku value' => null], + '$behavior' => \Magento\ImportExport\Model\Import::BEHAVIOR_DELETE, '$error' => RowValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, ], [ @@ -615,7 +605,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase '$invalidRows' => [ 0 => ['value'] ], - '$oldSkus' => [0 => 'value'], + '$behavior' => null, '$error' => RowValidatorInterface::ERROR_ROW_IS_ORPHAN, ], ]; -- GitLab From af2b6bdf3ffcac661bcc69885dfa29f09a8b9069 Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Tue, 2 Jun 2015 11:45:26 +0300 Subject: [PATCH 222/396] MAGNIMEX-145: Change for import images --- .../CatalogImportExport/Model/Import/Product.php | 12 ++++++------ pub/media/import/.htaccess | 2 ++ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 pub/media/import/.htaccess diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index 40383b9447c..642f1dc3a2c 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -1354,23 +1354,23 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity } // 5. Media gallery phase - $dispretionPath = Uploader::getDispretionPath($rowData[self::COL_MEDIA_IMAGE]); + $dispertionPath = Uploader::getDispretionPath($rowData[self::COL_MEDIA_IMAGE]); $imageName = preg_replace('/[^a-z0-9\._-]+/i','', $rowData[self::COL_MEDIA_IMAGE]); - $fullDispretionPath = $dispretionPath.'/'.$imageName; + $fullDispertionPath = $dispertionPath.'/'.$imageName; $imageIsSet = null; $imageFromProduct = null; $imageInProductIsSet = null; foreach($this->cachedImages as $image) { - if($image['sku']==$rowData[self::COL_SKU] && preg_replace('/_[0-9]+/','', $image['value'])==$fullDispretionPath) { + if($image['sku'] == $rowData[self::COL_SKU] && preg_replace('/_[0-9]+/','', $image['value']) == $fullDispertionPath) { $imageInProductIsSet = true; $imageFromProduct = $image['value']; break; - } elseif(in_array($fullDispretionPath, $image)) { + } elseif(in_array($fullDispertionPath, $image)) { $imageIsSet = true; break; } } - if( ($imageInProductIsSet && $imageFromProduct!=$fullDispretionPath) || (!isset($imageIsSet) && !isset($imageInProductIsSet)) ) { + if( ($imageInProductIsSet && $imageFromProduct != $fullDispertionPath) || (!isset($imageIsSet) && !isset($imageInProductIsSet)) ) { $mediaGalleryImages = array(); $mediaGalleryLabels = array(); if (!empty($rowData[self::COL_MEDIA_IMAGE])) { @@ -1419,7 +1419,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ]; } } - } elseif($imageInProductIsSet && $imageFromProduct==$fullDispretionPath) { + } elseif($imageInProductIsSet && $imageFromProduct == $fullDispertionPath) { $mediaGalleryImages = array(); $mediaGalleryLabels = array(); if (!empty($rowData[self::COL_MEDIA_IMAGE])) { diff --git a/pub/media/import/.htaccess b/pub/media/import/.htaccess new file mode 100644 index 00000000000..93169e4eb44 --- /dev/null +++ b/pub/media/import/.htaccess @@ -0,0 +1,2 @@ +Order deny,allow +Deny from all -- GitLab From 61658d9780d5131969d123a11e478a029c2a1826 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Tue, 2 Jun 2015 13:12:30 +0300 Subject: [PATCH 223/396] MAGNIMEX-178: Product unit tests - setUp --- .../Test/Unit/Model/Export/ProductTest.php | 239 +++++++++++++++++- 1 file changed, 237 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php index 3379c3fc25a..03b113ac0b5 100644 --- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php +++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php @@ -5,8 +5,100 @@ */ namespace Magento\CatalogImportExport\Test\Unit\Model\Export; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; + class ProductTest extends \PHPUnit_Framework_TestCase { + /** + * @var \Magento\Framework\Stdlib\DateTime\Timezone|\PHPUnit_Framework_MockObject_MockObject + */ + protected $localeDate; + + /** + * @var \Magento\Eav\Model\Config|\PHPUnit_Framework_MockObject_MockObject + */ + protected $config; + + /** + * @var \Magento\Framework\App\Resource|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resource; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + /** + * @var \Psr\Log\LoggerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $logger; + + /** + * @var \Magento\Catalog\Model\Resource\Product\Collection|\PHPUnit_Framework_MockObject_MockObject + */ + protected $collection; + + /** + * @var \Magento\ImportExport\Model\Export\ConfigInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $exportConfig; + + /** + * @var \Magento\Catalog\Model\Resource\ProductFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $productFactory; + + /** + * @var \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $attrSetColFactory; + + /** + * @var \Magento\Catalog\Model\Resource\Category\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $categoryColFactory; + + /** + * @var \Magento\CatalogInventory\Model\Resource\Stock\ItemFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $itemFactory; + + /** + * @var \Magento\Catalog\Model\Resource\Product\Option\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $optionColFactory; + + /** + * @var \Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $attributeColFactory; + + /** + * @var \Magento\CatalogImportExport\Model\Export\Product\Type\Factory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $_typeFactory; + + /** + * @var \Magento\Catalog\Model\Product\LinkTypeProvider|\PHPUnit_Framework_MockObject_MockObject + */ + protected $linkTypeProvider; + + /** + * @var \Magento\CatalogImportExport\Model\Export\RowCustomizer\Composite|\PHPUnit_Framework_MockObject_MockObject + */ + protected $rowCustomizer; + + /** + * @var \Magento\CatalogImportExport\Model\Export\Product|\PHPUnit_Framework_MockObject_MockObject + */ + protected $product; + + /** + * @var ObjectManagerHelper + */ + protected $objectManagerHelper; + /** * @var StubProduct|\Magento\CatalogImportExport\Model\Export\Product */ @@ -14,12 +106,150 @@ class ProductTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->localeDate = $this->getMock( + 'Magento\Framework\Stdlib\DateTime\Timezone', + [''], + [], + '', + false + ); + + $this->config = $this->getMock( + 'Magento\Eav\Model\Config', + [''], + [], + '', + false + ); + + $this->resource = $this->getMock( + 'Magento\Framework\App\Resource', + [''], + [], + '', + false + ); + + $this->storeManager = $this->getMock( + 'Magento\Store\Model\StoreManager', + [''], + [], + '', + false + ); + $this->logger = $this->getMock( + 'Magento\Framework\Logger\Monolog', + [''], + [], + '', + false + ); + + $this->collection = $this->getMock( + 'Magento\Catalog\Model\Resource\Product\Collection', + [''], + [], + '', + false + ); + $this->exportConfig = $this->getMock( + 'Magento\ImportExport\Model\Export\Config', + [''], + [], + '', + false + ); + + $this->productFactory = $this->getMock( + 'Magento\Catalog\Model\Resource\ProductFactory', + ['create', 'getTypeId'], + [], + '', + false + ); + + $this->attrSetColFactory = $this->getMock( + 'Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory', + ['create', 'setEntityTypeFilter'], + [], + '', + false + ); + + $this->categoryColFactory = $this->getMock( + 'Magento\Catalog\Model\Resource\Category\CollectionFactory', + ['create', 'addNameToResult'], + [], + '', + false + ); + + $this->itemFactory = $this->getMock( + 'Magento\CatalogInventory\Model\Resource\Stock\ItemFactory', + [''], + [], + '', + false + ); + $this->optionColFactory = $this->getMock( + 'Magento\Catalog\Model\Resource\Product\Option\CollectionFactory', + [''], + [], + '', + false + ); + + $this->attributeColFactory = $this->getMock( + 'Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory', + [''], + [], + '', + false + ); + $this->_typeFactory = $this->getMock( + 'Magento\CatalogImportExport\Model\Export\Product\Type\Factory', + [''], + [], + '', + false + ); + + $this->linkTypeProvider = $this->getMock( + 'Magento\Catalog\Model\Product\LinkTypeProvider', + [''], + [], + '', + false + ); + $this->rowCustomizer = $this->getMock( + 'Magento\CatalogImportExport\Model\Export\RowCustomizer\Composite', + [''], + [], + '', + false + ); + + $this->objectManagerHelper = new ObjectManagerHelper($this); + + $this->product = $this->objectManagerHelper->getObject( + 'Magento\CatalogImportExport\Model\Export\Product', + [ + 'localeDate' => $this->localeDate, + 'config' => $this->config, + 'resource' => $this->resource, + 'storeManager' => $this->storeManager + ] + ); + $this->_object = new StubProduct(); } - protected function tearDown() + /** + * Test getEntityTypeCode() + */ + public function testGetEntityTypeCode() { - unset($this->_object); + $this->assertEquals($this->product->getEntityTypeCode(), 'catalog_product'); } public function testUpdateDataWithCategoryColumnsNoCategoriesAssigned() @@ -30,4 +260,9 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->assertTrue($this->_object->updateDataWithCategoryColumns($dataRow, $rowCategories, $productId)); } + + protected function tearDown() + { + unset($this->_object); + } } -- GitLab From eb0bf48ef997148dc43ca4dc490e51a56be3e9d0 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Tue, 2 Jun 2015 13:29:50 +0300 Subject: [PATCH 224/396] MAGNIMEX-14: Downloading sample files - files added; --- .../templates/import/form/before.phtml | 2 +- pub/advanced_pricing.csv | 5 ++ pub/catalog_product.csv | 47 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 pub/advanced_pricing.csv create mode 100644 pub/catalog_product.csv diff --git a/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml b/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml index 6f417bae148..e0eb4542601 100644 --- a/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml +++ b/app/code/Magento/ImportExport/view/adminhtml/templates/import/form/before.phtml @@ -35,7 +35,7 @@ require(['jquery', 'prototype'], function(jQuery){ * Base url * @type {string} */ - sampleFilesBaseUrl: '<?php echo $block->getBaseUrl() ?>' + 'sample/files/', + sampleFilesBaseUrl: '<?php echo $block->getBaseUrl() ?>' + 'pub/', /** * Reset selected index diff --git a/pub/advanced_pricing.csv b/pub/advanced_pricing.csv new file mode 100644 index 00000000000..bfd24ea9bcc --- /dev/null +++ b/pub/advanced_pricing.csv @@ -0,0 +1,5 @@ +sku,tier_price_website,tier_price_customer_group,tier_price_qty,tier_price,group_price_website,group_price_customer_group,group_price_price +sku123,website1,General,2,10,,, +sku124,All Websites [USD],ALL GROUPS,3,15,,, +sku123,,,,,website1,General,11 +sku124,,,,,All Websites [USD],General,12 diff --git a/pub/catalog_product.csv b/pub/catalog_product.csv new file mode 100644 index 00000000000..a339a5921ea --- /dev/null +++ b/pub/catalog_product.csv @@ -0,0 +1,47 @@ +sku,website_code,store_view_code ,attribute_set_code,product_type,name,description,short_description ,weight ,product_online ,visibility ,product_websites ,categories ,price,special_price,special_price_from_date,special_price_to_date,tax_class_name,url_key,meta_title,meta_keywords,meta_description,base_image ,base_image_label ,small_image,small_image_label,thumbnail_image,thumbnail_image_label ,additional_images,additional_image_labels,configurable_variation_labels,configurable_variations ,bundle_price_type,bundle_sku_type,bundle_weight_type,bundle_values,downloadble_samples,downloadble_links,associated_skus ,related_skus ,crosssell_skus ,upsell_skus ,custom_options ,additional_attributes,manage_stock ,is_in_stock ,qty,out_of_stock_qty,is_qty_decimal,allow_backorders,min_cart_qty,max_cart_qty,notify_on_stock_below,qty_increments,enable_qty_increments,is_decimal_divided,new_from_date ,new_to_date,gift_message_available ,giftcard_type,giftcard_amount,giftcard_allow_open_amount,giftcard_open_amount_min,giftcard_open_amount_max,giftcard_lifetime,giftcard_allow_message,giftcard_email_template,created_at,updated_at,custom_design,custom_design_from,custom_design_to,custom_layout_update,page_layout ,product_options_container,msrp_price,msrp_display_actual_price_type,map_enabled +simplesku1,base,default,default,simple,Simple Product 1,Simple Product 1 Description,Simple Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,simple1urlkey,Simple Product 1 Meta Title,"simple, product",Simple Product 1 Meta Description,/mediaimport/simple1.png,Base Image Label,/mediaimport/simple1.png,Small Image Label,/mediaimport/simple1.png,Thumbnail Image Label,"/mediaimport/simple1.png, /mediaimport/simple1a.png","Label Simple 1, Label Simple 1a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +simplesku2withcustomoptions,base,default,default,simple,Simple Product 2 With Options,"<ul> +<li>Line 1</li> +<li>Line 2</li> +<li>Line 3</li> +<li>Simple Product 2 With Options Description</li> +</ul>",Simple Product 2 With Options Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,simple2urlkey,Simple Product 2 Meta Title,"simple, product",Simple Product 2 Meta Description,/mediaimport/simple2.png,Base Image Label,/mediaimport/simple2.png,Small Image Label,/mediaimport/simple2.png,Thumbnail Image Label,"/mediaimport/simple2.png, /mediaimport/simple2a.png","Label Simple 2, Label Simple 2a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7","name=Custom Option One,type=dropdown,required=1,option_title=custom option 1; sku=sku-option1,price=10.00, price_type=fixed|name=Custom Option One,type=dropdown,required=1,option_title=custom option 2,sku=sku-option3,price=11.00,price_type=fixed","attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +configurablesku1,base,default,default,configurable,Configurable Product 1,"<ul> +<li>Line 1</li> +<li>Line 2</li> +<li>Line 3</li> +<li>Configurable Product 1 Description</li> +</ul>",Configurable Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,configurable1urlkey,Configurable Product 1 Meta Title,"configurable, product",Configurable Product 1 Meta Description,/mediaimport/configurable1.png,Base Image Label,/mediaimport/configurable1.png,Small Image Label,/mediaimport/configurable1.png,Thumbnail Image Label,"/mediaimport/configurable1.png, /mediaimport/configurable1a.png","Label Configurable 1, Label Configurable 1a","color=Select Color, size=Select Size","sku=sku-red-xs,color=red,size=xs,price=10.99,display=1,image=http: +example.com/1.png|sku=sku-red-m,color=red,size=m,price=20.88,display=1,image=/example.com/2.png",,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +bundlesku1,base,default,default,bundle,Bundle Product 1,"<ul> +<li>Line 1</li> +<li>Line 2</li> +<li>Line 3</li> +<li>Bundle Product 1 Description</li> +</ul>",Bundle Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,bundle1urlkey,Bundle Product 1 Meta Title,bundle product,Bundle Product 1 Meta Description,/mediaimport/bundle1.png,Base Image Label,/mediaimport/bundle1.png,Small Image Label,/mediaimport/bundle1.png,Thumbnail Image Label,"/mediaimport/bundle1.png, /mediaimport/bundle1a.png","Label Bundle 1, Label Bundle 1a",,,fixed,fixed,fixed,"name=Bundle Option One,type=dropdown,required=1,sku=sku-option1,price=10; price_type=fixed, default_qty=1, is_defaul=1 | +name=Bundle Option One,type=dropdown; required=1, sku=sku-option1,price=10, price_type=fixed, default_qty=1, is_defaul=1",,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +bundlesku2,base,default,default,bundle,Bundle Product 2,"<ul> +<li>Line 1</li> +<li>Line 2</li> +<li>Line 3</li> +<li>Bundle Product 2 Description</li> +</ul>",Bundle Product 2 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,bundle1urlkey,Bundle Product 2 Meta Title,bundle product,Bundle Product 2 Meta Description,/mediaimport/bundle1.png,Base Image Label,/mediaimport/bundle1.png,Small Image Label,/mediaimport/bundle2.png,Thumbnail Image Label,"/mediaimport/bundle2.png, /mediaimport/bundl2a.png","Label Bundle 2, Label Bundle 2a",,,dynamic,fixed,fixed,"name=Bundle Option One,type=dropdown,required=1,sku=sku-option1, default_qty=1, is_defaul=1| +name=Bundle Option One,type=dropdown; required=1, sku=sku-option1, default_qty=1",,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +groupedsku1,base,default,default,grouped,Grouped Product 1,"<ul> +<li>Line 1</li> +<li>Line 2</li> +<li>Line 3</li> +<li>Grouped Product 1 Description</li> +</ul>",Grouped Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,grouped1urlkey,Grouped Product 1 Meta Title,grouped product,Grouped Product 1 Meta Description,/mediaimport/grouped1.png,Base Image Label,/mediaimport/grouped1.png,Small Image Label,/mediaimport/grouped1.png,Thumbnail Image Label,"/mediaimport/grouped1.png, /mediaimport/grouped1a.png","Label grouped 1, Label grouped 1a",,,,,,,,,"sku-product1=5,sku-product2=1,sku-product3=3 ","sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +giftsku1,base,default,default,gift,Gift Product 1,"<ul> +<li>Line 1</li> +<li>Line 2</li> +<li>Line 3</li> +<li>Gift Product 1 Description</li> +</ul>",Gift Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,Gift1urlkey,Gift Product 1 Meta Title,"gift, product",Gift Product 1 Meta Description,/mediaimport/gift1.png,Base Image Label,/mediaimport/gift1.png,Small Image Label,/mediaimport/gift1.png,Thumbnail Image Label,"/mediaimport/gift1.png, /mediaimport/gift1a.png","Label Gift 1, Label Gift 1a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,virtual,"100.00, 200.00, 300.00",1,100,1000,3,1,Gift Card(s) Purchase (Default),3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +downloadblesku1,base,default,default,downloadble,Downloadble Product 1,"<ul> +<li>Line 1</li> +<li>Line 2</li> +<li>Line 3</li> +<li>Downloadble Product 1 Description</li> +</ul>",Downloadble Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,Downloadble1urlkey,Downloadble Product 1 Meta Title,"Downloadble, product",Downloadble Product 1 Meta Description,/mediaimport/Downloadble1.png,Base Image Label,/mediaimport/Downloadble1.png,Small Image Label,/mediaimport/Downloadble1.png,Thumbnail Image Label,"/mediaimport/Downloadble1.png, /mediaimport/Downloadble1a.png","Label Downloadble 1, Label Downloadble 1a",,,,,,,"group_title=Group Title Samples, title=Title 1, file=media/file.mp4,sortorder=1|group_title=Group Title, title=Title 2, url=media/file2.mp4,sortorder=0","group_title=Group Title Links, title=Title 1, price=10, downloads=unlimited, file=media/file.mp4,sortorder=1|group_title=Group Title, title=Title 2, price=10, downloads=unlimited, url=media/file2.mp4,sortorder=0",,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 -- GitLab From 3c9cb7abcba133f92da0b589cc6af85d8078be00 Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Sat, 30 May 2015 23:38:34 +0300 Subject: [PATCH 225/396] MAGNIMEX-160: fix phpcs annotations report 2 --- .../Model/Import/Product/Type/Bundle.php | 7 +++++++ .../Test/Unit/Model/Import/ProductTest.php | 2 ++ .../Test/Unit/Block/Adminhtml/Import/Edit/FormTest.php | 1 + 3 files changed, 10 insertions(+) diff --git a/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php b/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php index 9f30386f84f..e573c60346b 100755 --- a/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php +++ b/app/code/Magento/BundleImportExport/Model/Import/Product/Type/Bundle.php @@ -88,6 +88,13 @@ class Bundle extends \Magento\CatalogImportExport\Model\Import\Product\Type\Abst */ protected $_cachedSkuToProducts = []; + /** + * Array of queries selecting cached options. + * + * @var array + */ + protected $_cachedOptionSelectQuery = []; + /** * Column names that holds values with particular meaning. * diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php index 758e4e0eef5..95e9af85894 100755 --- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php +++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Import/ProductTest.php @@ -89,8 +89,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase // @codingStandardsIgnoreStart /** @var \Magento\CatalogImportExport\Model\Import\Proxy\Product\ResourceFactory|\PHPUnit_Framework_MockObject_MockObject */ + // @codingStandardsIgnoreEnd protected $_resourceFactory; + // @codingStandardsIgnoreStart /** @var \Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $_setColFactory; diff --git a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Import/Edit/FormTest.php b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Import/Edit/FormTest.php index cdafbd029a2..142a6c2b5d4 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Import/Edit/FormTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Import/Edit/FormTest.php @@ -1,4 +1,5 @@ <?php + /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. -- GitLab From f7c62fb4b292d8749e04d83f4a049588d04aad31 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Tue, 2 Jun 2015 20:18:02 +0300 Subject: [PATCH 226/396] MAGNIMEX-178: Export unit tests - FilterTest --- .../Block/Adminhtml/Export/FilterTest.php | 282 ++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php diff --git a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php new file mode 100644 index 00000000000..765b76a5938 --- /dev/null +++ b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php @@ -0,0 +1,282 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\ImportExport\Test\Unit\Block\Adminhtml\Export; + +use Magento\Framework\Escaper; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; + +class Filter extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\Model\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $modelContext; + + /** + * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject + */ + protected $registry; + + /** + * @var \Magento\Framework\Api\ExtensionAttributesFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $extensionFactory; + + /** + * @var \Magento\Framework\Api\AttributeValueFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $customAttributeFactory; + + /** + * @var \Magento\Eav\Model\Config|\PHPUnit_Framework_MockObject_MockObject + */ + protected $eavConfig; + + /** + * @var \Magento\Eav\Model\Entity\TypeFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $eavTypeFactory; + + /** + * @var \Magento\Store\Model\StoreManager|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + /** + * @var \Magento\Eav\Model\Resource\Helper|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceHelper; + + /** + * @var \Magento\Framework\Validator\UniversalFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $universalFactory; + + /** + * @var \Magento\Eav\Api\Data\AttributeOptionInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + */ + protected $optionDataFactory; + + /** + * @var \Magento\Framework\Reflection\DataObjectProcessor|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dataObjectProcessor; + + /** + * @var \Magento\Framework\Api\DataObjectHelper|\PHPUnit_Framework_MockObject_MockObject + */ + protected $dataObjectHelper; + + /** + * @var \Magento\Framework\Stdlib\DateTime\Timezone|\PHPUnit_Framework_MockObject_MockObject + */ + protected $localeDate; + + /** + * @var \Magento\Catalog\Model\Product\ReservedAttributeList|\PHPUnit_Framework_MockObject_MockObject + */ + protected $reservedAttributeList; + + /** + * @var \Magento\Framework\Locale\Resolver|\PHPUnit_Framework_MockObject_MockObject + */ + protected $localeResolver; + + /** + * @var \Magento\Catalog\Model\Resource\Product|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resource; + + /** + * @var \Magento\Framework\Data\Collection\Db|\PHPUnit_Framework_MockObject_MockObject + */ + protected $resourceCollection; + + /** + * @var \Magento\Backend\Block\Template\Context|\PHPUnit_Framework_MockObject_MockObject + */ + protected $context; + + /** + * @var \Magento\Backend\Helper\Data|\PHPUnit_Framework_MockObject_MockObject + */ + protected $backendHelper; + + /** + * @var \Magento\ImportExport\Helper\Data|\PHPUnit_Framework_MockObject_MockObject + */ + protected $importExportData; + + /** + * @var ObjectManagerHelper + */ + protected $objectManagerHelper; + + /** + * @var \Magento\ImportExport\Block\Adminhtml\Export\Filter|\PHPUnit_Framework_MockObject_MockObject + */ + protected $filter; + + public function setUp() + { + $this->modelContext = $this->getMock('Magento\Framework\Model\Context', ['_construct'], [], '', false); + //$this->modelContext->expects($this->any())->method('_construct')->will($this->returnValue(true)); + $this->registry = $this->getMock('Magento\Framework\Registry', [], [], '', false); + $this->extensionFactory = $this->getMock( + 'Magento\Framework\Api\ExtensionAttributesFactory', + [], + [], + '', + false + ); + $this->customAttributeFactory = $this->getMock( + 'Magento\Framework\Api\AttributeValueFactory', + [], + [], + '', + false); + $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', [], [], '', false); + $this->eavTypeFactory = $this->getMock('Magento\Eav\Model\Entity\TypeFactory', [], [], '', false); + $this->storeManager = $this->getMock('Magento\Store\Model\StoreManager', [], [], '', false); + $this->resourceHelper = $this->getMock('Magento\Eav\Model\Resource\Helper', [], [], '', false); + $this->universalFactory = $this->getMock('Magento\Framework\Validator\UniversalFactory', [], [], '', false); + $this->optionDataFactory = $this->getMock( + 'Magento\Eav\Api\Data\AttributeOptionInterfaceFactory', + [], + [], + '', + false + ); + $this->dataObjectProcessor = $this->getMock( + 'Magento\Framework\Reflection\DataObjectProcessor', + [], + [], + '', + false + ); + $this->dataObjectHelper = $this->getMock('Magento\Framework\Api\DataObjectHelper', [], [], '', false); + $this->localeDate = $this->getMock('Magento\Framework\Stdlib\DateTime\Timezone', [], [], '', false); + $this->localeDate->expects($this->any())->method('getDateFormat')->will($this->returnValue('12-12-2012')); + + $this->reservedAttributeList = $this->getMock( + 'Magento\Catalog\Model\Product\ReservedAttributeList', + [], + [], + '', + false + ); + $this->localeResolver = $this->getMock('Magento\Framework\Locale\Resolver', [], [], '', false); + $this->resource = $this->getMock('Magento\Catalog\Model\Resource\Product', [], [], '', false); + $this->resourceCollection = $this->getMock('Magento\Framework\Data\Collection\Db', [], [], '', false); + + $this->context = $this->getMock( + 'Magento\Backend\Block\Template\Context', + ['getFileSystem', 'getEscaper', 'getLocaleDate'], + [], + '', + false + ); + $filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); + $this->context->expects($this->any())->method('getFileSystem')->will($this->returnValue($filesystem)); + $escaper = $this->getMock('Magento\Framework\Escaper', ['escapeHtml'], [], '', false); + $escaper->expects($this->any())->method('escapeHtml')->will($this->returnValue('')); + $this->context->expects($this->any())->method('getEscaper')->will($this->returnValue($escaper)); + $timeZone = $this->getMock('Magento\Framework\Stdlib\DateTime\TimeZone', [], [], '', false); + $timeZone->expects($this->any())->method('getDateFormat')->will($this->returnValue('M/d/yy')); + $this->context->expects($this->any())->method('getLocaleDate')->will($this->returnValue($timeZone)); + $this->backendHelper = $this->getMock('Magento\Backend\Helper\Data', [], [], '', false); + $this->importExportData = $this->getMock('Magento\ImportExport\Helper\Data', [], [], '', false); + $this->objectManagerHelper = new ObjectManagerHelper($this); + $this->filter = $this->objectManagerHelper->getObject( + 'Magento\ImportExport\Block\Adminhtml\Export\Filter', + [ + 'context' => $this->context, + 'backendHelper' => $this->backendHelper, + 'importExportData' => $this->importExportData + ] + ); + } + + /** + * Test decorateFilter() + * + * @param string $attributeCode + * @param array $columnValue + * @dataProvider decorateFilterDataProvider + */ + public function testDecorateFilter($attributeCode, $backendType, $columnValue) + { + $value = ''; + $attribute = new \Magento\Eav\Model\Entity\Attribute( + $this->modelContext, + $this->registry, + $this->extensionFactory, + $this->customAttributeFactory, + $this->eavConfig, + $this->eavTypeFactory, + $this->storeManager, + $this->resourceHelper, + $this->universalFactory, + $this->optionDataFactory, + $this->dataObjectProcessor, + $this->dataObjectHelper, + $this->localeDate, + $this->reservedAttributeList, + $this->localeResolver, + $this->resource, + $this->resourceCollection + ); + + $attribute->setAttributeCode($attributeCode); + $attribute->setBackendType($backendType); + $column = new \Magento\Framework\Object(); + $column->setData($columnValue, 'value'); + $isExport = true; + + $this->filter->decorateFilter($value, $attribute, $column, $isExport); + } + + /** + * Dataprovider for testDecorateFilter() + * + * @return array + */ + public function decorateFilterDataProvider() + { + return [ + [ + 'attributeCode' => 'custom_design_from', + 'backendType' => 'datetime', + 'columnValue' => ['values' => ['custom_design_from' => 'custom_design_from']] + ], + [ + 'attributeCode' => 'category_ids', + 'backendType' => 'varchar', + 'columnValue' => ['values' => ['category_ids' => '1']] + ], + [ + 'attributeCode' => 'cost', + 'backendType' => 'decimal', + 'columnValue' => ['values' => ['cost' => 'cost']] + ], + [ + 'attributeCode' => 'color', + 'backendType' => 'text', + 'columnValue' => ['values' => ['color' => 'red']] + ] + ]; + } + + /** + * Test for protected method prepareForm() + * + * @todo to implement it. + */ + public function test_prepareForm() + { + $this->markTestIncomplete('This test has not been implemented yet.'); + } +} -- GitLab From 53f2259783f87618c26e7967e85ca6dfb010b62a Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Tue, 2 Jun 2015 22:54:00 +0300 Subject: [PATCH 227/396] MAGNIMEX-237: Fix message for error when sku is empty --- .../Model/Import/AdvancedPricing.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index a0011c5b526..9bcf3e5359e 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -178,7 +178,9 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract // BEHAVIOR_DELETE use specific validation logic if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { if (!isset($rowData[self::COL_SKU])) { - $this->addRowError(ValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, $rowNum); + throw new \Magento\Framework\Exception\LocalizedException( + __('Cannot find required columns: %1', self::COL_SKU) + ); return false; } return true; -- GitLab From c0a581d03495f8fa3835b34c45021bc44f99104a Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Wed, 3 Jun 2015 00:22:31 +0300 Subject: [PATCH 228/396] MAGNIMEX-145: Small fix for duplicate images --- app/code/Magento/CatalogImportExport/Model/Import/Product.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index 642f1dc3a2c..b35b1c677c5 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -1363,7 +1363,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity foreach($this->cachedImages as $image) { if($image['sku'] == $rowData[self::COL_SKU] && preg_replace('/_[0-9]+/','', $image['value']) == $fullDispertionPath) { $imageInProductIsSet = true; - $imageFromProduct = $image['value']; + $imageFromProduct = preg_replace('/_[0-9]+/','', $image['value']); break; } elseif(in_array($fullDispertionPath, $image)) { $imageIsSet = true; -- GitLab From f0fe5f992e80444761529ee8e661e4912b6b54e1 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Tue, 2 Jun 2015 23:59:28 +0000 Subject: [PATCH 229/396] MAGNIMEX-178: Unit tests Tests for Export/Product class:getHeaderColumns(), export() Add removed method to obsolete ones --- .../Model/Export/Product.php | 4 +- .../Test/Unit/Model/Export/ProductTest.php | 267 +++++++++++++++--- .../Test/Legacy/_files/obsolete_methods.php | 1 + 3 files changed, 236 insertions(+), 36 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 5b3a265ad3d..73ecdf27f4b 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -1097,7 +1097,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity * * @return array */ - private function _customFieldsMapping($rowData) + protected function _customFieldsMapping($rowData) { foreach ($this->_fieldsMap as $system_field_name => $file_field_name) { if (isset($rowData[$system_field_name])) { @@ -1115,7 +1115,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity * * @return array */ - private function _customHeadersMapping($rowData) + protected function _customHeadersMapping($rowData) { foreach ($rowData as $key => $field_name) { if (isset($this->_fieldsMap[$field_name])) { diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php index 03b113ac0b5..f12a9cd9962 100644 --- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php +++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php @@ -6,7 +6,11 @@ namespace Magento\CatalogImportExport\Test\Unit\Model\Export; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use \Magento\Store\Model\Store; +/** + * @SuppressWarnings(PHPMD) + */ class ProductTest extends \PHPUnit_Framework_TestCase { /** @@ -77,7 +81,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase /** * @var \Magento\CatalogImportExport\Model\Export\Product\Type\Factory|\PHPUnit_Framework_MockObject_MockObject */ - protected $_typeFactory; + protected $typeFactory; /** * @var \Magento\Catalog\Model\Product\LinkTypeProvider|\PHPUnit_Framework_MockObject_MockObject @@ -90,25 +94,26 @@ class ProductTest extends \PHPUnit_Framework_TestCase protected $rowCustomizer; /** - * @var \Magento\CatalogImportExport\Model\Export\Product|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\ImportExport\Model\Export\Adapter\AbstractAdapter| \PHPUnit_Framework_MockObject_MockObject */ - protected $product; + protected $writer; /** - * @var ObjectManagerHelper + * @var \Magento\CatalogImportExport\Model\Export\Product|\PHPUnit_Framework_MockObject_MockObject */ - protected $objectManagerHelper; + protected $product; + /** * @var StubProduct|\Magento\CatalogImportExport\Model\Export\Product */ - protected $_object; + protected $object; protected function setUp() { $this->localeDate = $this->getMock( 'Magento\Framework\Stdlib\DateTime\Timezone', - [''], + [], [], '', false @@ -116,15 +121,23 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->config = $this->getMock( 'Magento\Eav\Model\Config', - [''], + ['getEntityType'], [], '', false ); + $type = $this->getMock( + '\Magento\Eav\Model\Entity\Type', + [], + [], + '', + false + ); + $this->config->expects($this->once())->method('getEntityType')->willReturn($type); $this->resource = $this->getMock( 'Magento\Framework\App\Resource', - [''], + [], [], '', false @@ -132,14 +145,14 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->storeManager = $this->getMock( 'Magento\Store\Model\StoreManager', - [''], + [], [], '', false ); $this->logger = $this->getMock( 'Magento\Framework\Logger\Monolog', - [''], + [], [], '', false @@ -147,14 +160,20 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->collection = $this->getMock( 'Magento\Catalog\Model\Resource\Product\Collection', - [''], + [ + 'count', + 'setOrder', + 'setStoreId', + 'getCurPage', + 'getLastPageNumber', + ], [], '', false ); $this->exportConfig = $this->getMock( 'Magento\ImportExport\Model\Export\Config', - [''], + [], [], '', false @@ -162,7 +181,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->productFactory = $this->getMock( 'Magento\Catalog\Model\Resource\ProductFactory', - ['create', 'getTypeId'], + [ + 'create', + 'getTypeId', + ], [], '', false @@ -170,7 +192,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->attrSetColFactory = $this->getMock( 'Magento\Eav\Model\Resource\Entity\Attribute\Set\CollectionFactory', - ['create', 'setEntityTypeFilter'], + [ + 'create', + 'setEntityTypeFilter', + ], [], '', false @@ -178,7 +203,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->categoryColFactory = $this->getMock( 'Magento\Catalog\Model\Resource\Category\CollectionFactory', - ['create', 'addNameToResult'], + [ + 'create', + 'addNameToResult', + ], [], '', false @@ -186,14 +214,14 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->itemFactory = $this->getMock( 'Magento\CatalogInventory\Model\Resource\Stock\ItemFactory', - [''], + [], [], '', false ); $this->optionColFactory = $this->getMock( 'Magento\Catalog\Model\Resource\Product\Option\CollectionFactory', - [''], + [], [], '', false @@ -201,14 +229,14 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->attributeColFactory = $this->getMock( 'Magento\Catalog\Model\Resource\Product\Attribute\CollectionFactory', - [''], + [], [], '', false ); - $this->_typeFactory = $this->getMock( + $this->typeFactory = $this->getMock( 'Magento\CatalogImportExport\Model\Export\Product\Type\Factory', - [''], + [], [], '', false @@ -216,32 +244,84 @@ class ProductTest extends \PHPUnit_Framework_TestCase $this->linkTypeProvider = $this->getMock( 'Magento\Catalog\Model\Product\LinkTypeProvider', - [''], + [], [], '', false ); $this->rowCustomizer = $this->getMock( 'Magento\CatalogImportExport\Model\Export\RowCustomizer\Composite', - [''], + [], [], '', false ); - $this->objectManagerHelper = new ObjectManagerHelper($this); + $this->writer = $this->getMock( + 'Magento\ImportExport\Model\Export\Adapter\AbstractAdapter', + [ + 'setHeaderCols', + 'writeRow', + 'getContents', + ], + [], + '', + false + ); - $this->product = $this->objectManagerHelper->getObject( + $constructorMethods = [ + 'initTypeModels', + 'initAttributes', + '_initStores', + 'initAttributeSets', + 'initWebsites', + 'initCategories' + ]; + + $mockMethods = array_merge($constructorMethods, [ + '_customHeadersMapping', + '_prepareEntityCollection', + '_getEntityCollection', + 'getWriter', + 'getExportData', + '_headerColumns', + '_customFieldsMapping', + 'getItemsPerPage', + 'paginateCollection', + '_getHeaderColumns', + ]); + $this->product = $this->getMock( 'Magento\CatalogImportExport\Model\Export\Product', - [ - 'localeDate' => $this->localeDate, - 'config' => $this->config, - 'resource' => $this->resource, - 'storeManager' => $this->storeManager - ] + $mockMethods, + [], + '', + false ); - $this->_object = new StubProduct(); + foreach ($constructorMethods as $method) { + $this->product->expects($this->once())->method($method)->will($this->returnSelf()); + } + + $this->product->__construct( + $this->localeDate, + $this->config, + $this->resource, + $this->storeManager, + $this->logger, + $this->collection, + $this->exportConfig, + $this->productFactory, + $this->attrSetColFactory, + $this->categoryColFactory, + $this->itemFactory, + $this->optionColFactory, + $this->attributeColFactory, + $this->typeFactory, + $this->linkTypeProvider, + $this->rowCustomizer + ); + + $this->object = new StubProduct(); } /** @@ -258,11 +338,130 @@ class ProductTest extends \PHPUnit_Framework_TestCase $productId = 1; $rowCategories = [$productId => []]; - $this->assertTrue($this->_object->updateDataWithCategoryColumns($dataRow, $rowCategories, $productId)); + $this->assertTrue($this->object->updateDataWithCategoryColumns($dataRow, $rowCategories, $productId)); + } + + public function testGetHeaderColumns() + { + $product = $this->getMock( + 'Magento\CatalogImportExport\Model\Export\Product', + ['_customHeadersMapping'], + [], + '', + false + ); + $headerColumnsValue = ['headerColumns value']; + $expectedResult = 'result'; + $this->setPropertyValue($product, '_headerColumns', $headerColumnsValue); + $product + ->expects($this->once()) + ->method('_customHeadersMapping') + ->with($headerColumnsValue) + ->willReturn($expectedResult); + + $result = $product->_getHeaderColumns(); + + $this->assertEquals($expectedResult, $result); + } + + public function testExportCountZeroBreakInternalCalls() + { + $page = 1; + $itemsPerPage = 10; + + $this->product->expects($this->once())->method('getWriter')->willReturn($this->writer); + $this->product->expects($this->exactly(4))->method('_getEntityCollection')->willReturn($this->collection); + $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->collection); + $this->product->expects($this->once())->method('getItemsPerPage')->willReturn($itemsPerPage); + $this->product->expects($this->once())->method('paginateCollection')->with($page, $itemsPerPage); + $this->collection->expects($this->once())->method('setOrder')->with('has_options', 'asc'); + $this->collection->expects($this->once())->method('setStoreId')->with(Store::DEFAULT_STORE_ID); + + $this->collection->expects($this->once())->method('count')->willReturn(0); + + $this->collection->expects($this->never())->method('getCurPage'); + $this->collection->expects($this->never())->method('getLastPageNumber'); + $this->product->expects($this->never())->method('_getHeaderColumns'); + $this->writer->expects($this->never())->method('setHeaderCols'); + $this->writer->expects($this->never())->method('writeRow'); + $this->product->expects($this->never())->method('getExportData'); + $this->product->expects($this->never())->method('_customFieldsMapping'); + + $this->writer->expects($this->once())->method('getContents'); + + $this->product->export(); + } + + public function testExportCurPageEqualToLastBreakInternalCalls() + { + $curPage = $lastPage = $page = 1; + $itemsPerPage = 10; + + $this->product->expects($this->once())->method('getWriter')->willReturn($this->writer); + $this->product->expects($this->exactly(6))->method('_getEntityCollection')->willReturn($this->collection); + $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->collection); + $this->product->expects($this->once())->method('getItemsPerPage')->willReturn($itemsPerPage); + $this->product->expects($this->once())->method('paginateCollection')->with($page, $itemsPerPage); + $this->collection->expects($this->once())->method('setOrder')->with('has_options', 'asc'); + $this->collection->expects($this->once())->method('setStoreId')->with(Store::DEFAULT_STORE_ID); + + $this->collection->expects($this->once())->method('count')->willReturn(1); + + $this->collection->expects($this->once())->method('getCurPage')->willReturn($curPage); + $this->collection->expects($this->once())->method('getLastPageNumber')->willReturn($lastPage); + $headers = ['headers']; + $this->product->expects($this->once())->method('_getHeaderColumns')->willReturn($headers); + $this->writer->expects($this->once())->method('setHeaderCols')->with($headers); + $row = 'value'; + $data = [$row]; + $this->product->expects($this->once())->method('getExportData')->willReturn($data); + $customFieldsMappingResult = ['result']; + $this->product + ->expects($this->once()) + ->method('_customFieldsMapping') + ->with($row) + ->willReturn($customFieldsMappingResult); + $this->writer->expects($this->once())->method('writeRow')->with($customFieldsMappingResult); + + $this->writer->expects($this->once())->method('getContents'); + + $this->product->export(); } protected function tearDown() { - unset($this->_object); + unset($this->object); + } + + /** + * Get any object property value. + * + * @param $object + * @param $property + */ + protected function getPropertyValue($object, $property) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + + return $reflectionProperty->getValue($object); + } + + /** + * Set object property value. + * + * @param $object + * @param $property + * @param $value + */ + protected function setPropertyValue(&$object, $property, $value) + { + $reflection = new \ReflectionClass(get_class($object)); + $reflectionProperty = $reflection->getProperty($property); + $reflectionProperty->setAccessible(true); + $reflectionProperty->setValue($object, $value); + + return $object; } } 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 9d673b85440..bf75d97ec53 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 @@ -771,6 +771,7 @@ return [ ['getAffectedEntityIds', 'Magento\CatalogImportExport\Model\Import\Product'], ['getCategoryWithRoot', 'Magento\CatalogImportExport\Model\Import\Product\CategoryProcessor'], ['getCategory', 'Magento\CatalogImportExport\Model\Import\Product\CategoryProcessor'], + ['prepareGroupPrices', 'Magento\CatalogImportExport\Model\Export\Product'], ['prepareGoogleOptimizerScripts'], ['prepareRedirect', 'Magento\Core\Controller\Varien\Exception'], ['preparePriceAlertData', 'Magento\ProductAlert\Block\Product\View'], -- GitLab From ba579d412c88aa6a461adddfc19769f9ea05f01a Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Wed, 3 Jun 2015 10:09:29 +0300 Subject: [PATCH 230/396] MAGNIMEX-237: Right Fix error message --- .../Model/Import/AdvancedPricing.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 9bcf3e5359e..4a0453f9f56 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -104,6 +104,13 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract */ protected $groupPriceValidator; + /** + * Permanent entity columns. + * + * @var string[] + */ + protected $_permanentAttributes = [self::COL_SKU]; + /** * @param \Magento\Framework\Json\Helper\Data $jsonHelper * @param \Magento\ImportExport\Helper\Data $importExportData @@ -178,9 +185,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract // BEHAVIOR_DELETE use specific validation logic if (\Magento\ImportExport\Model\Import::BEHAVIOR_DELETE == $this->getBehavior()) { if (!isset($rowData[self::COL_SKU])) { - throw new \Magento\Framework\Exception\LocalizedException( - __('Cannot find required columns: %1', self::COL_SKU) - ); + $this->addRowError(ValidatorInterface::ERROR_SKU_IS_EMPTY, $rowNum); return false; } return true; -- GitLab From b8246937ed1ce581f22bf780a9de5ee6f3f7ab68 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Wed, 3 Jun 2015 11:04:49 +0300 Subject: [PATCH 231/396] MAGNIMEX-178: Export unit tests - FilterTest implemented; --- .../Block/Adminhtml/Export/FilterTest.php | 71 ++++++++++++++----- 1 file changed, 53 insertions(+), 18 deletions(-) diff --git a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php index 765b76a5938..088f9916ebe 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php @@ -5,9 +5,11 @@ */ namespace Magento\ImportExport\Test\Unit\Block\Adminhtml\Export; -use Magento\Framework\Escaper; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +/** + * @SuppressWarnings(PHPMD) + */ class Filter extends \PHPUnit_Framework_TestCase { /** @@ -122,8 +124,7 @@ class Filter extends \PHPUnit_Framework_TestCase public function setUp() { - $this->modelContext = $this->getMock('Magento\Framework\Model\Context', ['_construct'], [], '', false); - //$this->modelContext->expects($this->any())->method('_construct')->will($this->returnValue(true)); + $this->modelContext = $this->getMock('Magento\Framework\Model\Context', [], [], '', false); $this->registry = $this->getMock('Magento\Framework\Registry', [], [], '', false); $this->extensionFactory = $this->getMock( 'Magento\Framework\Api\ExtensionAttributesFactory', @@ -160,7 +161,6 @@ class Filter extends \PHPUnit_Framework_TestCase $this->dataObjectHelper = $this->getMock('Magento\Framework\Api\DataObjectHelper', [], [], '', false); $this->localeDate = $this->getMock('Magento\Framework\Stdlib\DateTime\Timezone', [], [], '', false); $this->localeDate->expects($this->any())->method('getDateFormat')->will($this->returnValue('12-12-2012')); - $this->reservedAttributeList = $this->getMock( 'Magento\Catalog\Model\Product\ReservedAttributeList', [], @@ -171,10 +171,9 @@ class Filter extends \PHPUnit_Framework_TestCase $this->localeResolver = $this->getMock('Magento\Framework\Locale\Resolver', [], [], '', false); $this->resource = $this->getMock('Magento\Catalog\Model\Resource\Product', [], [], '', false); $this->resourceCollection = $this->getMock('Magento\Framework\Data\Collection\Db', [], [], '', false); - $this->context = $this->getMock( 'Magento\Backend\Block\Template\Context', - ['getFileSystem', 'getEscaper', 'getLocaleDate'], + ['getFileSystem', 'getEscaper', 'getLocaleDate', 'getLayout'], [], '', false @@ -187,6 +186,20 @@ class Filter extends \PHPUnit_Framework_TestCase $timeZone = $this->getMock('Magento\Framework\Stdlib\DateTime\TimeZone', [], [], '', false); $timeZone->expects($this->any())->method('getDateFormat')->will($this->returnValue('M/d/yy')); $this->context->expects($this->any())->method('getLocaleDate')->will($this->returnValue($timeZone)); + $dateBlock = $this->getMock( + 'Magento\Framework\View\Element\Html\Date', + ['setValue', 'getHtml', 'setId', 'getId'], + [], + '', + false + ); + $dateBlock->expects($this->any())->method('setValue')->will($this->returnSelf()); + $dateBlock->expects($this->any())->method('getHtml')->will($this->returnValue('')); + $dateBlock->expects($this->any())->method('setId')->will($this->returnSelf()); + $dateBlock->expects($this->any())->method('getId')->will($this->returnValue(1)); + $layout = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); + $layout->expects($this->any())->method('createBlock')->will($this->returnValue($dateBlock)); + $this->context->expects($this->any())->method('getLayout')->will($this->returnValue($layout)); $this->backendHelper = $this->getMock('Magento\Backend\Helper\Data', [], [], '', false); $this->importExportData = $this->getMock('Magento\ImportExport\Helper\Data', [], [], '', false); $this->objectManagerHelper = new ObjectManagerHelper($this); @@ -203,11 +216,12 @@ class Filter extends \PHPUnit_Framework_TestCase /** * Test decorateFilter() * - * @param string $attributeCode - * @param array $columnValue + * @param array $attributeData + * @param string $backendType + * @param array $columnValue * @dataProvider decorateFilterDataProvider */ - public function testDecorateFilter($attributeCode, $backendType, $columnValue) + public function testDecorateFilter($attributeData, $backendType, $columnValue) { $value = ''; $attribute = new \Magento\Eav\Model\Entity\Attribute( @@ -229,13 +243,14 @@ class Filter extends \PHPUnit_Framework_TestCase $this->resource, $this->resourceCollection ); - - $attribute->setAttributeCode($attributeCode); + $attribute->setAttributeCode($attributeData['code']); + $attribute->setFrontendInput($attributeData['input']); + $attribute->setOptions($attributeData['options']); + $attribute->setFilterOptions($attributeData['filter_options']); $attribute->setBackendType($backendType); $column = new \Magento\Framework\Object(); $column->setData($columnValue, 'value'); $isExport = true; - $this->filter->decorateFilter($value, $attribute, $column, $isExport); } @@ -248,23 +263,43 @@ class Filter extends \PHPUnit_Framework_TestCase { return [ [ - 'attributeCode' => 'custom_design_from', + 'attributeCode' => [ + 'code' =>'updated_at', + 'input' => '', + 'options' => [], + 'filter_options' => [] + ], 'backendType' => 'datetime', - 'columnValue' => ['values' => ['custom_design_from' => 'custom_design_from']] + 'columnValue' => ['values' => ['updated_at' => '12/12/12']] ], [ - 'attributeCode' => 'category_ids', + 'attributeCode' => [ + 'code' => 'category_ids', + 'input' => '', + 'options' => [], + 'filter_options' => [] + ], 'backendType' => 'varchar', 'columnValue' => ['values' => ['category_ids' => '1']] ], [ - 'attributeCode' => 'cost', + 'attributeCode' => [ + 'code' => 'cost', + 'input' => '', + 'options' => [], + 'filter_options' => [] + ], 'backendType' => 'decimal', 'columnValue' => ['values' => ['cost' => 'cost']] ], [ - 'attributeCode' => 'color', - 'backendType' => 'text', + 'attributeCode' => [ + 'code' => 'color', + 'input' => 'select', + 'options' => ['red' => 'red'], + 'filter_options' => ['opt' => 'val'] + ], + 'backendType' => 'select', 'columnValue' => ['values' => ['color' => 'red']] ] ]; -- GitLab From d2c3d5f68d3fe6a5c7cc38bd3e57c1a369110d77 Mon Sep 17 00:00:00 2001 From: Dmitry Kologrivov <dmitry_kologrivov@epam.com> Date: Wed, 3 Jun 2015 12:38:55 +0300 Subject: [PATCH 232/396] MAGNIMEX-6: fix composer --- .../Model/Import/AdvancedPricing/Validator/Website.php | 2 ++ app/code/Magento/AdvancedPricingImportExport/composer.json | 3 +++ 2 files changed, 5 insertions(+) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php index ff48ba2d2d3..743e8d7a94e 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php @@ -1,4 +1,5 @@ <?php + /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. @@ -15,6 +16,7 @@ class Website extends AbstractValidator implements RowValidatorInterface * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver */ protected $storeResolver; + protected $webSiteModel; /** * @param \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver diff --git a/app/code/Magento/AdvancedPricingImportExport/composer.json b/app/code/Magento/AdvancedPricingImportExport/composer.json index 8f3a911a466..621832c02a2 100644 --- a/app/code/Magento/AdvancedPricingImportExport/composer.json +++ b/app/code/Magento/AdvancedPricingImportExport/composer.json @@ -5,8 +5,11 @@ "php": "~5.5.0|~5.6.0", "magento/module-catalog": "0.74.0-beta10", "magento/module-import-export": "0.74.0-beta10", + "magento/indexer": "0.74.0-beta10", "magento/module-catalog-import-export": "0.74.0-beta10", + "magento/module-customer": "0.74.0-beta10", "magento/module-eav": "0.74.0-beta10", + "magento/module-store": "0.74.0-beta10", "magento/framework": "0.74.0-beta10", "magento/magento-composer-installer": "*" }, -- GitLab From ac09ec7e7606e818584d5e833b2f27a5834022c6 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Tue, 9 Jun 2015 09:43:19 +0000 Subject: [PATCH 233/396] MAGNIMEX-6: fixed unit tests --- .../Unit/Model/Import/AdvancedPricingTest.php | 2 +- .../Test/Unit/Model/Export/ProductTest.php | 54 ++++++++++++------- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php index b6d78a000a8..1c9bd601066 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php @@ -595,7 +595,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase 0 => ['value'] ], '$behavior' => \Magento\ImportExport\Model\Import::BEHAVIOR_DELETE, - '$error' => RowValidatorInterface::ERROR_SKU_NOT_FOUND_FOR_DELETE, + '$error' => RowValidatorInterface::ERROR_SKU_IS_EMPTY, ], [ '$rowData' => [ diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php index f12a9cd9962..0c0b4daff14 100644 --- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php +++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php @@ -39,10 +39,15 @@ class ProductTest extends \PHPUnit_Framework_TestCase protected $logger; /** - * @var \Magento\Catalog\Model\Resource\Product\Collection|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Catalog\Model\Resource\Product\CollectionFactory|\PHPUnit_Framework_MockObject_MockObject */ protected $collection; + /** + * @var \Magento\Eav\Model\Entity\Collection\AbstractCollection|\PHPUnit_Framework_MockObject_MockObject + */ + protected $abstractCollection; + /** * @var \Magento\ImportExport\Model\Export\ConfigInterface|\PHPUnit_Framework_MockObject_MockObject */ @@ -159,17 +164,26 @@ class ProductTest extends \PHPUnit_Framework_TestCase ); $this->collection = $this->getMock( - 'Magento\Catalog\Model\Resource\Product\Collection', + '\Magento\Catalog\Model\Resource\Product\CollectionFactory', + [], + [], + '', + false + ); + $this->abstractCollection = $this->getMockForAbstractClass( + '\Magento\Eav\Model\Entity\Collection\AbstractCollection', + [], + '', + false, + true, + true, [ 'count', 'setOrder', 'setStoreId', 'getCurPage', 'getLastPageNumber', - ], - [], - '', - false + ] ); $this->exportConfig = $this->getMock( 'Magento\ImportExport\Model\Export\Config', @@ -370,17 +384,17 @@ class ProductTest extends \PHPUnit_Framework_TestCase $itemsPerPage = 10; $this->product->expects($this->once())->method('getWriter')->willReturn($this->writer); - $this->product->expects($this->exactly(4))->method('_getEntityCollection')->willReturn($this->collection); - $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->collection); + $this->product->expects($this->exactly(1))->method('_getEntityCollection')->willReturn($this->abstractCollection); + $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->abstractCollection); $this->product->expects($this->once())->method('getItemsPerPage')->willReturn($itemsPerPage); $this->product->expects($this->once())->method('paginateCollection')->with($page, $itemsPerPage); - $this->collection->expects($this->once())->method('setOrder')->with('has_options', 'asc'); - $this->collection->expects($this->once())->method('setStoreId')->with(Store::DEFAULT_STORE_ID); + $this->abstractCollection->expects($this->once())->method('setOrder')->with('has_options', 'asc'); + $this->abstractCollection->expects($this->once())->method('setStoreId')->with(Store::DEFAULT_STORE_ID); - $this->collection->expects($this->once())->method('count')->willReturn(0); + $this->abstractCollection->expects($this->once())->method('count')->willReturn(0); - $this->collection->expects($this->never())->method('getCurPage'); - $this->collection->expects($this->never())->method('getLastPageNumber'); + $this->abstractCollection->expects($this->never())->method('getCurPage'); + $this->abstractCollection->expects($this->never())->method('getLastPageNumber'); $this->product->expects($this->never())->method('_getHeaderColumns'); $this->writer->expects($this->never())->method('setHeaderCols'); $this->writer->expects($this->never())->method('writeRow'); @@ -398,17 +412,17 @@ class ProductTest extends \PHPUnit_Framework_TestCase $itemsPerPage = 10; $this->product->expects($this->once())->method('getWriter')->willReturn($this->writer); - $this->product->expects($this->exactly(6))->method('_getEntityCollection')->willReturn($this->collection); - $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->collection); + $this->product->expects($this->exactly(1))->method('_getEntityCollection')->willReturn($this->abstractCollection); + $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->abstractCollection); $this->product->expects($this->once())->method('getItemsPerPage')->willReturn($itemsPerPage); $this->product->expects($this->once())->method('paginateCollection')->with($page, $itemsPerPage); - $this->collection->expects($this->once())->method('setOrder')->with('has_options', 'asc'); - $this->collection->expects($this->once())->method('setStoreId')->with(Store::DEFAULT_STORE_ID); + $this->abstractCollection->expects($this->once())->method('setOrder')->with('has_options', 'asc'); + $this->abstractCollection->expects($this->once())->method('setStoreId')->with(Store::DEFAULT_STORE_ID); - $this->collection->expects($this->once())->method('count')->willReturn(1); + $this->abstractCollection->expects($this->once())->method('count')->willReturn(1); - $this->collection->expects($this->once())->method('getCurPage')->willReturn($curPage); - $this->collection->expects($this->once())->method('getLastPageNumber')->willReturn($lastPage); + $this->abstractCollection->expects($this->once())->method('getCurPage')->willReturn($curPage); + $this->abstractCollection->expects($this->once())->method('getLastPageNumber')->willReturn($lastPage); $headers = ['headers']; $this->product->expects($this->once())->method('_getHeaderColumns')->willReturn($headers); $this->writer->expects($this->once())->method('setHeaderCols')->with($headers); -- GitLab From 57ad7153b52d007489e277190713abe0e97366d2 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Tue, 9 Jun 2015 13:50:15 +0000 Subject: [PATCH 234/396] MAGNIMEX-6: Unit tests and phpcsmd fixes --- .../Model/Import/AdvancedPricing.php | 27 +++++++++---- .../Import/AdvancedPricing/Validator.php | 4 +- .../AdvancedPricing/Validator/GroupPrice.php | 5 ++- .../AdvancedPricing/Validator/TierPrice.php | 3 +- .../AdvancedPricing/Validator/Website.php | 10 +++-- .../Indexer/Product/Price/Plugin/Import.php | 4 ++ .../Unit/Model/Import/AdvancedPricingTest.php | 10 ++--- .../Model/Export/Product.php | 38 +++++++++---------- .../Model/Import/Uploader.php | 5 ++- .../Block/Adminhtml/Export/FilterTest.php | 5 ++- 10 files changed, 68 insertions(+), 43 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php index 4a0453f9f56..7acf70d675e 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing.php @@ -8,6 +8,12 @@ namespace Magento\AdvancedPricingImportExport\Model\Import; use Magento\CatalogImportExport\Model\Import\Product as ImportProduct; use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface; +/** + * Class AdvancedPricing + * + * @SuppressWarnings(PHPMD.ExcessiveParameterList) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity { const VALUE_ALL_GROUPS = 'ALL GROUPS'; @@ -140,8 +146,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract AdvancedPricing\Validator $validator, AdvancedPricing\Validator\Website $websiteValidator, AdvancedPricing\Validator\GroupPrice $groupPriceValidator - ) - { + ) { $this->jsonHelper = $jsonHelper; $this->_importExportData = $importExportData; $this->_resourceHelper = $resourceHelper; @@ -225,6 +230,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract /** * Save advanced pricing + * + * @return void */ public function saveAdvancedPricing() { @@ -266,6 +273,8 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract /** * Deletes Advanced price data from raw data. + * + * @return void */ public function deleteAdvancedPricing() { @@ -330,12 +339,14 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract protected function deleteProductTierAndGroupPrices(array $listSku, $tableName) { if ($tableName && $listSku) { - if(!$this->_cachedSkuToDelete) { - $this->_cachedSkuToDelete = $this->_connection->fetchCol($this->_connection->select() + if (!$this->_cachedSkuToDelete) { + $this->_cachedSkuToDelete = $this->_connection->fetchCol( + $this->_connection->select() ->from($this->_connection->getTableName('catalog_product_entity'), 'entity_id') - ->where('sku IN (?)', $listSku)); + ->where('sku IN (?)', $listSku) + ); } - if($this->_cachedSkuToDelete) { + if ($this->_cachedSkuToDelete) { $this->_connection->delete( $tableName, $this->_connection->quoteInto('entity_id IN (?)', $this->_cachedSkuToDelete) @@ -351,7 +362,7 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract /** * Get website id by code * - * @param $websiteCode + * @param string $websiteCode * @return array|int|string */ protected function getWebSiteId($websiteCode) @@ -388,4 +399,4 @@ class AdvancedPricing extends \Magento\ImportExport\Model\Import\Entity\Abstract ); return $oldSkus; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php index ad05fa7957d..309988fb2a2 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php @@ -41,6 +41,8 @@ class Validator extends AbstractValidator implements RowValidatorInterface /** * Init validators + * + * @return void */ public function init() { @@ -48,4 +50,4 @@ class Validator extends AbstractValidator implements RowValidatorInterface $validator->init(); } } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php index 6711b743523..09023725008 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php @@ -68,7 +68,8 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid || $this->hasEmptyColumns($value)) { $this->_addMessages([self::ERROR_GROUP_PRICE_DATA_INCOMPLETE]); return false; - } elseif ($value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] == AdvancedPricing::VALUE_ALL_GROUPS + } elseif ( + $value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP] == AdvancedPricing::VALUE_ALL_GROUPS || !isset($this->customerGroups[$value[AdvancedPricing::COL_GROUP_PRICE_CUSTOMER_GROUP]]) ) { $this->_addMessages([self::ERROR_INVALID_GROUP_PRICE_GROUP]); @@ -124,4 +125,4 @@ class GroupPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valid } return $hasEmptyValues; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php index c60a26dfff8..e849a0ebfa3 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php @@ -56,6 +56,7 @@ class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valida * * @param mixed $value * @return bool + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function isValid($value) { @@ -118,4 +119,4 @@ class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valida } return $hasEmptyValues; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php index 743e8d7a94e..b636413338b 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php @@ -16,16 +16,20 @@ class Website extends AbstractValidator implements RowValidatorInterface * @var \Magento\CatalogImportExport\Model\Import\Product\StoreResolver */ protected $storeResolver; + + /** + * @var \Magento\Store\Model\WebSite + */ protected $webSiteModel; /** * @param \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver + * @param \Magento\Store\Model\WebSite $webSiteModel */ public function __construct( \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver, \Magento\Store\Model\WebSite $webSiteModel - ) - { + ) { $this->storeResolver = $storeResolver; $this->webSiteModel = $webSiteModel; } @@ -72,4 +76,4 @@ class Website extends AbstractValidator implements RowValidatorInterface { return AdvancedPricing::VALUE_ALL_WEBSITES . ' ['.$this->webSiteModel->getBaseCurrency()->getCurrencyCode().']'; } -} \ No newline at end of file +} diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php index 9c6335d483b..01a1fe1877c 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php @@ -9,6 +9,8 @@ class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\Abstrac { /** * After import handler + * + * @return void */ public function afterSaveAdvancedPricing() { @@ -19,6 +21,8 @@ class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\Abstrac /** * After delete handler + * + * @return void */ public function afterDeleteAdvancedPricing() { diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php index 1c9bd601066..f26b5560ca9 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Import/AdvancedPricingTest.php @@ -331,14 +331,14 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase public function testDeleteAdvancedPricingFormListSkuToDelete() { - $sku_1 = 'sku value'; - $sku_2 = 'sku value'; + $skuOne = 'sku value'; + $skuTwo = 'sku value'; $data = [ 0 => [ - AdvancedPricing::COL_SKU => $sku_1 + AdvancedPricing::COL_SKU => $skuOne ], 1 => [ - AdvancedPricing::COL_SKU => $sku_2 + AdvancedPricing::COL_SKU => $skuTwo ], ]; @@ -650,7 +650,7 @@ class AdvancedPricingTest extends \PHPUnit_Framework_TestCase * * @return \PHPUnit_Framework_MockObject_MockObject */ - private function getAdvancedPricingMock($methods = array()) + private function getAdvancedPricingMock($methods = []) { return $this->getMock( '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing', diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 73ecdf27f4b..06106d80500 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -624,7 +624,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity if (!isset($rowCategories[$productId])) { return false; } - $categories = array(); + $categories = []; foreach ($rowCategories[$productId] as $categoryId) { $categoryPath = $this->_rootCategories[$categoryId]; if (isset($this->_categories[$categoryId])) { @@ -854,7 +854,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity * @var \Magento\Catalog\Model\Product $item */ foreach ($collection as $itemId => $item) { - $additionalAttributes = array(); + $additionalAttributes = []; foreach ($this->_getExportAttrCodes() as $code) { $attrValue = $item->getData($code); if (!$this->isValidAttributeValue($code, $attrValue)) { @@ -1020,29 +1020,29 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity unset($dataRow[self::COL_STORE]); $this->updateDataWithCategoryColumns($dataRow, $multiRawData['rowCategories'], $productId); if (!empty($multiRawData['rowWebsites'][$productId])) { - $websiteCodes = array(); + $websiteCodes = []; foreach ($multiRawData['rowWebsites'][$productId] as $productWebsite) { $websiteCodes[] = $this->_websiteIdToCode[$productWebsite]; } $dataRow['_product_websites'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $websiteCodes); - $multiRawData['rowWebsites'][$productId] = array(); + $multiRawData['rowWebsites'][$productId] = []; } if (!empty($multiRawData['mediaGalery'][$productId])) { - $additionalImages = array(); - $additionalImageLabels = array(); + $additionalImages = []; + $additionalImageLabels = []; foreach ($multiRawData['mediaGalery'][$productId] as $mediaItem) { $additionalImages[] = $mediaItem['_media_image']; $additionalImageLabels[] = $mediaItem['_media_label']; } $dataRow['additional_images'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImages); $dataRow['additional_image_labels'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageLabels); - $multiRawData['mediaGalery'][$productId] = array(); + $multiRawData['mediaGalery'][$productId] = []; } foreach ($this->_linkTypeProvider->getLinkTypes() as $linkTypeName => $linkId) { if (!empty($multiRawData['linksRows'][$productId][$linkId])) { $colPrefix = $linkTypeName . '_'; - $associations = array(); + $associations = []; foreach ($multiRawData['linksRows'][$productId][$linkId] as $linkData) { if ($linkData['default_qty'] !== null) { $skuItem = $linkData['sku'] . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $linkData['default_qty']; @@ -1051,7 +1051,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity } $associations[$skuItem] = $linkData['position']; } - $multiRawData['linksRows'][$productId][$linkId] = array(); + $multiRawData['linksRows'][$productId][$linkId] = []; asort($associations); $dataRow[$colPrefix . 'skus'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, array_keys($associations)); } @@ -1070,10 +1070,10 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity if (!empty($multiRawData['customOptionsData'][$productId][$storeId])) { $customOptionsRows = $multiRawData['customOptionsData'][$productId][$storeId]; - $multiRawData['customOptionsData'][$productId][$storeId] = array(); + $multiRawData['customOptionsData'][$productId][$storeId] = []; $customOptions = implode(ImportProduct::PSEUDO_MULTI_LINE_SEPARATOR, $customOptionsRows); - $dataRow = array_merge($dataRow, array('custom_options' => $customOptions)); + $dataRow = array_merge($dataRow, ['custom_options' => $customOptions]); } if (empty($dataRow)) { @@ -1099,10 +1099,10 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity */ protected function _customFieldsMapping($rowData) { - foreach ($this->_fieldsMap as $system_field_name => $file_field_name) { - if (isset($rowData[$system_field_name])) { - $rowData[$file_field_name] = $rowData[$system_field_name]; - unset($rowData[$system_field_name]); + foreach ($this->_fieldsMap as $systemFieldName => $fileFieldName) { + if (isset($rowData[$systemFieldName])) { + $rowData[$fileFieldName] = $rowData[$systemFieldName]; + unset($rowData[$systemFieldName]); } } return $rowData; @@ -1117,9 +1117,9 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity */ protected function _customHeadersMapping($rowData) { - foreach ($rowData as $key => $field_name) { - if (isset($this->_fieldsMap[$field_name])) { - $rowData[$key] = $this->_fieldsMap[$field_name]; + foreach ($rowData as $key => $fieldName) { + if (isset($this->_fieldsMap[$fieldName])) { + $rowData[$key] = $this->_fieldsMap[$fieldName]; } } return $rowData; @@ -1131,7 +1131,7 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity */ protected function optionRowToCellString($option) { - $result = array(); + $result = []; foreach ($option as $key => $value) { $result[] = $key . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $value; diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php b/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php index 772f5182860..0de5545a49c 100644 --- a/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Uploader.php @@ -135,11 +135,12 @@ class Uploader extends \Magento\MediaStorage\Model\File\Uploader * Proceed moving a file from TMP to destination folder * * @param string $fileName + * @param bool $renameFileOff * @return array */ - public function move($fileName, $renameFileOff=false) + public function move($fileName, $renameFileOff = false) { - if($renameFileOff) { + if ($renameFileOff) { $this->setAllowRenameFiles(false); } if (preg_match('/\bhttps?:\/\//i', $fileName, $matches)) { diff --git a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php index 088f9916ebe..6e3dda814ad 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php @@ -138,7 +138,8 @@ class Filter extends \PHPUnit_Framework_TestCase [], [], '', - false); + false + ); $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', [], [], '', false); $this->eavTypeFactory = $this->getMock('Magento\Eav\Model\Entity\TypeFactory', [], [], '', false); $this->storeManager = $this->getMock('Magento\Store\Model\StoreManager', [], [], '', false); @@ -310,7 +311,7 @@ class Filter extends \PHPUnit_Framework_TestCase * * @todo to implement it. */ - public function test_prepareForm() + public function testPrepareForm() { $this->markTestIncomplete('This test has not been implemented yet.'); } -- GitLab From 0e5ad1ca7e6fa16c70d94b12143e151f69855395 Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Wed, 10 Jun 2015 11:37:36 +0000 Subject: [PATCH 235/396] MAGNIMEX-6: move the removed method into obsolete ones --- .../testsuite/Magento/Test/Legacy/_files/obsolete_methods.php | 1 + 1 file changed, 1 insertion(+) 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 bf75d97ec53..3b890cb067a 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 @@ -772,6 +772,7 @@ return [ ['getCategoryWithRoot', 'Magento\CatalogImportExport\Model\Import\Product\CategoryProcessor'], ['getCategory', 'Magento\CatalogImportExport\Model\Import\Product\CategoryProcessor'], ['prepareGroupPrices', 'Magento\CatalogImportExport\Model\Export\Product'], + ['prepareTierPrices', 'Magento\CatalogImportExport\Model\Export\Product'], ['prepareGoogleOptimizerScripts'], ['prepareRedirect', 'Magento\Core\Controller\Varien\Exception'], ['preparePriceAlertData', 'Magento\ProductAlert\Block\Product\View'], -- GitLab From 69dcf98044291e6b688e86fc1386e8ac1672a61d Mon Sep 17 00:00:00 2001 From: Andrei Kuprienka <Andrei_Kuprienka@epam.com> Date: Fri, 12 Jun 2015 11:05:45 +0000 Subject: [PATCH 236/396] MAGNIMEX-178: fix unit tests in ImportExport module --- .../Test/Unit/Block/Adminhtml/Export/FilterTest.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php index 6e3dda814ad..bf90463768c 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php @@ -171,7 +171,12 @@ class Filter extends \PHPUnit_Framework_TestCase ); $this->localeResolver = $this->getMock('Magento\Framework\Locale\Resolver', [], [], '', false); $this->resource = $this->getMock('Magento\Catalog\Model\Resource\Product', [], [], '', false); - $this->resourceCollection = $this->getMock('Magento\Framework\Data\Collection\Db', [], [], '', false); + $this->resourceCollection = $this->getMockForAbstractClass( + 'Magento\Framework\Data\Collection\AbstractDb', + [], + '', + false + ); $this->context = $this->getMock( 'Magento\Backend\Block\Template\Context', ['getFileSystem', 'getEscaper', 'getLocaleDate', 'getLayout'], -- GitLab From ea519eda270b8edfe17c64bb14ebb737e0c553c3 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Fri, 12 Jun 2015 14:44:34 +0300 Subject: [PATCH 237/396] MAGNIMEX-145: code style chanages --- .../CatalogImportExport/Model/Import/Product.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index b35b1c677c5..c0433570f2e 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -10,7 +10,6 @@ namespace Magento\CatalogImportExport\Model\Import; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface as ValidatorInterface; -use Magento\Framework\File\Uploader; use Magento\Framework\Model\Resource\Db\TransactionManagerInterface; use Magento\Framework\Model\Resource\Db\ObjectRelationProcessor; use Magento\Framework\Stdlib\DateTime; @@ -1354,23 +1353,23 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity } // 5. Media gallery phase - $dispertionPath = Uploader::getDispretionPath($rowData[self::COL_MEDIA_IMAGE]); + $dispertionPath = \Magento\Framework\File\Uploader::getDispretionPath($rowData[self::COL_MEDIA_IMAGE]); $imageName = preg_replace('/[^a-z0-9\._-]+/i','', $rowData[self::COL_MEDIA_IMAGE]); $fullDispertionPath = $dispertionPath.'/'.$imageName; $imageIsSet = null; $imageFromProduct = null; $imageInProductIsSet = null; - foreach($this->cachedImages as $image) { - if($image['sku'] == $rowData[self::COL_SKU] && preg_replace('/_[0-9]+/','', $image['value']) == $fullDispertionPath) { + foreach ($this->cachedImages as $image) { + if ($image['sku'] == $rowData[self::COL_SKU] && preg_replace('/_[0-9]+/', '', $image['value']) == $fullDispertionPath) { $imageInProductIsSet = true; - $imageFromProduct = preg_replace('/_[0-9]+/','', $image['value']); + $imageFromProduct = preg_replace('/_[0-9]+/', '', $image['value']); break; - } elseif(in_array($fullDispertionPath, $image)) { + } elseif (in_array($fullDispertionPath, $image)) { $imageIsSet = true; break; } } - if( ($imageInProductIsSet && $imageFromProduct != $fullDispertionPath) || (!isset($imageIsSet) && !isset($imageInProductIsSet)) ) { + if (($imageInProductIsSet && $imageFromProduct != $fullDispertionPath) || (!isset($imageIsSet) && !isset($imageInProductIsSet))) { $mediaGalleryImages = array(); $mediaGalleryLabels = array(); if (!empty($rowData[self::COL_MEDIA_IMAGE])) { @@ -1419,7 +1418,7 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ]; } } - } elseif($imageInProductIsSet && $imageFromProduct == $fullDispertionPath) { + } elseif ($imageInProductIsSet && $imageFromProduct == $fullDispertionPath) { $mediaGalleryImages = array(); $mediaGalleryLabels = array(); if (!empty($rowData[self::COL_MEDIA_IMAGE])) { -- GitLab From a9c51df27f63b62cf8dea55915b5588b0073217b Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Sun, 14 Jun 2015 13:10:02 +0300 Subject: [PATCH 238/396] MAGNIMEX-15: phpcs changes --- .../Model/Export/Product.php | 26 +++++++++++++------ .../Test/Unit/Model/Export/ProductTest.php | 11 ++++++-- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Export/Product.php b/app/code/Magento/CatalogImportExport/Model/Export/Product.php index 06106d80500..b7573b98eea 100644 --- a/app/code/Magento/CatalogImportExport/Model/Export/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Export/Product.php @@ -876,7 +876,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity if ($this->_attributeTypes[$code] !== 'multiselect') { if (is_scalar($attrValue)) { if (!in_array($fieldName, $this->_getExportMainAttrCodes())) { - $additionalAttributes[$fieldName] = $fieldName . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $attrValue; + $additionalAttributes[$fieldName] = $fieldName . + ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $attrValue; } $data[$itemId][$storeId][$fieldName] = $attrValue; } else { @@ -886,7 +887,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity } if (!empty($additionalAttributes)) { - $data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalAttributes); + $data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES] = + implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalAttributes); } else { unset($data[$itemId][$storeId][self::COL_ADDITIONAL_ATTRIBUTES]); } @@ -1024,7 +1026,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity foreach ($multiRawData['rowWebsites'][$productId] as $productWebsite) { $websiteCodes[] = $this->_websiteIdToCode[$productWebsite]; } - $dataRow['_product_websites'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $websiteCodes); + $dataRow['_product_websites'] = + implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $websiteCodes); $multiRawData['rowWebsites'][$productId] = []; } if (!empty($multiRawData['mediaGalery'][$productId])) { @@ -1034,8 +1037,10 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity $additionalImages[] = $mediaItem['_media_image']; $additionalImageLabels[] = $mediaItem['_media_label']; } - $dataRow['additional_images'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImages); - $dataRow['additional_image_labels'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageLabels); + $dataRow['additional_images'] = + implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImages); + $dataRow['additional_image_labels'] = + implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $additionalImageLabels); $multiRawData['mediaGalery'][$productId] = []; } foreach ($this->_linkTypeProvider->getLinkTypes() as $linkTypeName => $linkId) { @@ -1045,7 +1050,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity $associations = []; foreach ($multiRawData['linksRows'][$productId][$linkId] as $linkData) { if ($linkData['default_qty'] !== null) { - $skuItem = $linkData['sku'] . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $linkData['default_qty']; + $skuItem = $linkData['sku'] . ImportProduct::PAIR_NAME_VALUE_SEPARATOR . + $linkData['default_qty']; } else { $skuItem = $linkData['sku']; } @@ -1053,7 +1059,8 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity } $multiRawData['linksRows'][$productId][$linkId] = []; asort($associations); - $dataRow[$colPrefix . 'skus'] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, array_keys($associations)); + $dataRow[$colPrefix . 'skus'] = + implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, array_keys($associations)); } } $dataRow = $this->rowCustomizer->addData($dataRow, $productId); @@ -1063,7 +1070,10 @@ class Product extends \Magento\ImportExport\Model\Export\Entity\AbstractEntity if (!empty($this->collectedMultiselectsData[$storeId][$productId])) { foreach (array_keys($this->collectedMultiselectsData[$storeId][$productId]) as $attrKey) { if (!empty($this->collectedMultiselectsData[$storeId][$productId][$attrKey])) { - $dataRow[$attrKey] = implode(ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, $this->collectedMultiselectsData[$storeId][$productId][$attrKey]); + $dataRow[$attrKey] = implode( + ImportProduct::DEFAULT_GLOBAL_MULTI_VALUE_SEPARATOR, + $this->collectedMultiselectsData[$storeId][$productId][$attrKey] + ); } } } diff --git a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php index 0c0b4daff14..b6333d9bcb3 100644 --- a/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php +++ b/app/code/Magento/CatalogImportExport/Test/Unit/Model/Export/ProductTest.php @@ -384,7 +384,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase $itemsPerPage = 10; $this->product->expects($this->once())->method('getWriter')->willReturn($this->writer); - $this->product->expects($this->exactly(1))->method('_getEntityCollection')->willReturn($this->abstractCollection); + $this->product + ->expects($this->exactly(1)) + ->method('_getEntityCollection') + ->willReturn($this->abstractCollection); $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->abstractCollection); $this->product->expects($this->once())->method('getItemsPerPage')->willReturn($itemsPerPage); $this->product->expects($this->once())->method('paginateCollection')->with($page, $itemsPerPage); @@ -412,7 +415,10 @@ class ProductTest extends \PHPUnit_Framework_TestCase $itemsPerPage = 10; $this->product->expects($this->once())->method('getWriter')->willReturn($this->writer); - $this->product->expects($this->exactly(1))->method('_getEntityCollection')->willReturn($this->abstractCollection); + $this->product + ->expects($this->exactly(1)) + ->method('_getEntityCollection') + ->willReturn($this->abstractCollection); $this->product->expects($this->once())->method('_prepareEntityCollection')->with($this->abstractCollection); $this->product->expects($this->once())->method('getItemsPerPage')->willReturn($itemsPerPage); $this->product->expects($this->once())->method('paginateCollection')->with($page, $itemsPerPage); @@ -452,6 +458,7 @@ class ProductTest extends \PHPUnit_Framework_TestCase * * @param $object * @param $property + * @return mixed */ protected function getPropertyValue($object, $property) { -- GitLab From bf585a2c658b95238f98b95d0fb8e371d41e55e9 Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Sun, 14 Jun 2015 22:24:00 +0300 Subject: [PATCH 239/396] MAGNIMEX-6: Importing Advanced Prices - fix tests. --- .../AdvancedPricing/Validator/TierPrice.php | 3 ++- .../Import/AdvancedPricing/Validator/Website.php | 12 ++++++------ .../Indexer/Product/Price/Plugin/Import.php | 10 ++++++++-- .../Indexer/Product/Price/Plugin/ImportTest.php | 16 ++++++++++++++-- .../AdvancedPricingImportExport/composer.json | 16 +++++++--------- .../Unit/Block/Adminhtml/Export/FilterTest.php | 2 +- 6 files changed, 38 insertions(+), 21 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php index e849a0ebfa3..cb84d7f8652 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php @@ -78,7 +78,8 @@ class TierPrice extends \Magento\CatalogImportExport\Model\Import\Product\Valida ) { $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_GROUP]); return false; - } elseif ($value[AdvancedPricing::COL_TIER_PRICE_QTY] <= 0 || $value[AdvancedPricing::COL_TIER_PRICE] <= 0) { + } elseif ($value[AdvancedPricing::COL_TIER_PRICE_QTY] <= 0 + || $value[AdvancedPricing::COL_TIER_PRICE] <= 0) { $this->_addMessages([self::ERROR_INVALID_TIER_PRICE_QTY]); return false; } diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php index b636413338b..352faf1bbc9 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php @@ -18,20 +18,20 @@ class Website extends AbstractValidator implements RowValidatorInterface protected $storeResolver; /** - * @var \Magento\Store\Model\WebSite + * @var \Magento\Store\Model\Website */ - protected $webSiteModel; + protected $websiteModel; /** * @param \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver - * @param \Magento\Store\Model\WebSite $webSiteModel + * @param \Magento\Store\Model\Website $websiteModel */ public function __construct( \Magento\CatalogImportExport\Model\Import\Product\StoreResolver $storeResolver, - \Magento\Store\Model\WebSite $webSiteModel + \Magento\Store\Model\Website $websiteModel ) { $this->storeResolver = $storeResolver; - $this->webSiteModel = $webSiteModel; + $this->websiteModel = $websiteModel; } /** @@ -74,6 +74,6 @@ class Website extends AbstractValidator implements RowValidatorInterface */ public function getAllWebsitesValue() { - return AdvancedPricing::VALUE_ALL_WEBSITES . ' ['.$this->webSiteModel->getBaseCurrency()->getCurrencyCode().']'; + return AdvancedPricing::VALUE_ALL_WEBSITES . ' ['.$this->websiteModel->getBaseCurrency()->getCurrencyCode().']'; } } diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php index 01a1fe1877c..d1b94795ecb 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Indexer/Product/Price/Plugin/Import.php @@ -5,14 +5,18 @@ */ namespace Magento\AdvancedPricingImportExport\Model\Indexer\Product\Price\Plugin; +use Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; + class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\AbstractPlugin { /** * After import handler * + * @param AdvancedPricing $subject * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function afterSaveAdvancedPricing() + public function afterSaveAdvancedPricing(AdvancedPricing $subject) { if (!$this->getPriceIndexer()->isScheduled()) { $this->invalidateIndexer(); @@ -22,9 +26,11 @@ class Import extends \Magento\Catalog\Model\Indexer\Product\Price\Plugin\Abstrac /** * After delete handler * + * @param AdvancedPricing $subject * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ - public function afterDeleteAdvancedPricing() + public function afterDeleteAdvancedPricing(AdvancedPricing $subject) { if (!$this->getPriceIndexer()->isScheduled()) { $this->invalidateIndexer(); diff --git a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php index d715ab11276..f12d4026ef8 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php +++ b/app/code/Magento/AdvancedPricingImportExport/Test/Unit/Model/Indexer/Product/Price/Plugin/ImportTest.php @@ -20,6 +20,11 @@ class ImportTest extends \PHPUnit_Framework_TestCase */ protected $import; + /** + * @var \Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing|\PHPUnit_Framework_MockObject_MockObject + */ + protected $advancedPricing; + public function setUp() { $this->indexer = $this->getMockForAbstractClass('\Magento\Indexer\Model\IndexerInterface', [], '', false); @@ -30,6 +35,13 @@ class ImportTest extends \PHPUnit_Framework_TestCase '', false ); + $this->advancedPricing = $this->getMock( + '\Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing', + [], + [], + '', + false + ); $this->import->expects($this->any())->method('getPriceIndexer')->willReturn($this->indexer); } @@ -38,7 +50,7 @@ class ImportTest extends \PHPUnit_Framework_TestCase $this->indexer->expects($this->once())->method('isScheduled')->willReturn(false); $this->import->expects($this->once())->method('invalidateIndexer'); - $this->import->afterSaveAdvancedPricing(); + $this->import->afterSaveAdvancedPricing($this->advancedPricing); } public function testAfterDeleteAdvancedPricing() @@ -46,6 +58,6 @@ class ImportTest extends \PHPUnit_Framework_TestCase $this->indexer->expects($this->once())->method('isScheduled')->willReturn(false); $this->import->expects($this->once())->method('invalidateIndexer'); - $this->import->afterSaveAdvancedPricing(); + $this->import->afterSaveAdvancedPricing($this->advancedPricing); } } diff --git a/app/code/Magento/AdvancedPricingImportExport/composer.json b/app/code/Magento/AdvancedPricingImportExport/composer.json index 621832c02a2..68dfacca050 100644 --- a/app/code/Magento/AdvancedPricingImportExport/composer.json +++ b/app/code/Magento/AdvancedPricingImportExport/composer.json @@ -3,18 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta10", - "magento/module-import-export": "0.74.0-beta10", - "magento/indexer": "0.74.0-beta10", - "magento/module-catalog-import-export": "0.74.0-beta10", - "magento/module-customer": "0.74.0-beta10", - "magento/module-eav": "0.74.0-beta10", - "magento/module-store": "0.74.0-beta10", - "magento/framework": "0.74.0-beta10", + "magento/module-catalog": "0.74.0-beta12", + "magento/module-import-export": "0.74.0-beta12", + "magento/module-catalog-import-export": "0.74.0-beta12", + "magento/module-customer": "0.74.0-beta12", + "magento/module-store": "0.74.0-beta12", + "magento/framework": "0.74.0-beta12", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta10", + "version": "0.74.0-beta12", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php index bf90463768c..2fbda38c94c 100644 --- a/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php +++ b/app/code/Magento/ImportExport/Test/Unit/Block/Adminhtml/Export/FilterTest.php @@ -10,7 +10,7 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHe /** * @SuppressWarnings(PHPMD) */ -class Filter extends \PHPUnit_Framework_TestCase +class FilterTest extends \PHPUnit_Framework_TestCase { /** * @var \Magento\Framework\Model\Context|\PHPUnit_Framework_MockObject_MockObject -- GitLab From b38e1cfc6bc2452f04b6655f1429bda70318962a Mon Sep 17 00:00:00 2001 From: Siarhei Andreyeu <Siearhei_Andreyeu@epam.com> Date: Mon, 15 Jun 2015 18:33:43 +0300 Subject: [PATCH 240/396] MAGNIMEX-6: Importing Advanced Prices - fix tests. --- .../Import/AdvancedPricing/Validator.php | 5 +++- .../AdvancedPricing/Validator/GroupPrice.php | 1 - .../AdvancedPricing/Validator/TierPrice.php | 1 - .../AdvancedPricing/Validator/Website.php | 1 - pub/catalog_product.csv | 24 +++++++++---------- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php index 309988fb2a2..71124546a93 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator.php @@ -1,5 +1,8 @@ <?php - +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ namespace Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; use Magento\CatalogImportExport\Model\Import\Product\RowValidatorInterface; diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php index 09023725008..3d62cdc330c 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/GroupPrice.php @@ -3,7 +3,6 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator; use Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php index cb84d7f8652..a54157c4895 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/TierPrice.php @@ -3,7 +3,6 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing\Validator; use Magento\AdvancedPricingImportExport\Model\Import\AdvancedPricing; diff --git a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php index 352faf1bbc9..bbfb97222f6 100644 --- a/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php +++ b/app/code/Magento/AdvancedPricingImportExport/Model/Import/AdvancedPricing/Validator/Website.php @@ -1,5 +1,4 @@ <?php - /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. diff --git a/pub/catalog_product.csv b/pub/catalog_product.csv index a339a5921ea..4b334bff3ee 100644 --- a/pub/catalog_product.csv +++ b/pub/catalog_product.csv @@ -1,47 +1,47 @@ -sku,website_code,store_view_code ,attribute_set_code,product_type,name,description,short_description ,weight ,product_online ,visibility ,product_websites ,categories ,price,special_price,special_price_from_date,special_price_to_date,tax_class_name,url_key,meta_title,meta_keywords,meta_description,base_image ,base_image_label ,small_image,small_image_label,thumbnail_image,thumbnail_image_label ,additional_images,additional_image_labels,configurable_variation_labels,configurable_variations ,bundle_price_type,bundle_sku_type,bundle_weight_type,bundle_values,downloadble_samples,downloadble_links,associated_skus ,related_skus ,crosssell_skus ,upsell_skus ,custom_options ,additional_attributes,manage_stock ,is_in_stock ,qty,out_of_stock_qty,is_qty_decimal,allow_backorders,min_cart_qty,max_cart_qty,notify_on_stock_below,qty_increments,enable_qty_increments,is_decimal_divided,new_from_date ,new_to_date,gift_message_available ,giftcard_type,giftcard_amount,giftcard_allow_open_amount,giftcard_open_amount_min,giftcard_open_amount_max,giftcard_lifetime,giftcard_allow_message,giftcard_email_template,created_at,updated_at,custom_design,custom_design_from,custom_design_to,custom_layout_update,page_layout ,product_options_container,msrp_price,msrp_display_actual_price_type,map_enabled -simplesku1,base,default,default,simple,Simple Product 1,Simple Product 1 Description,Simple Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,simple1urlkey,Simple Product 1 Meta Title,"simple, product",Simple Product 1 Meta Description,/mediaimport/simple1.png,Base Image Label,/mediaimport/simple1.png,Small Image Label,/mediaimport/simple1.png,Thumbnail Image Label,"/mediaimport/simple1.png, /mediaimport/simple1a.png","Label Simple 1, Label Simple 1a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +sku,website_code,store_view_code,attribute_set_code,product_type,name,description,short_description,weight,product_online,visibility,product_websites,categories,price,special_price,special_price_from_date,special_price_to_date,tax_class_name,url_key,meta_title,meta_keywords,meta_description,base_image,base_image_label,small_image,small_image_label,thumbnail_image,thumbnail_image_label,additional_images,additional_image_labels,configurable_variation_labels,configurable_variations,bundle_price_type,bundle_sku_type,bundle_weight_type,bundle_values,downloadble_samples,downloadble_links,associated_skus,related_skus,crosssell_skus,upsell_skus,custom_options,additional_attributes,manage_stock,is_in_stock,qty,out_of_stock_qty,is_qty_decimal,allow_backorders,min_cart_qty,max_cart_qty,notify_on_stock_below,qty_increments,enable_qty_increments,is_decimal_divided,new_from_date,new_to_date,created_at,updated_at,custom_design,custom_design_from,custom_design_to,custom_layout_update,page_layout,product_options_container,msrp_price,msrp_display_actual_price_type,map_enabled +simplesku1,base,default,default,simple,Simple Product 1,Simple Product 1 Description,Simple Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,simple1urlkey,Simple Product 1 Meta Title,"simple, product",Simple Product 1 Meta Description,/mediaimport/simple1.png,Base Image Label,/mediaimport/simple1.png,Small Image Label,/mediaimport/simple1.png,Thumbnail Image Label,"/mediaimport/simple1.png, /mediaimport/simple1a.png","Label Simple 1, Label Simple 1a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 simplesku2withcustomoptions,base,default,default,simple,Simple Product 2 With Options,"<ul> <li>Line 1</li> <li>Line 2</li> <li>Line 3</li> <li>Simple Product 2 With Options Description</li> -</ul>",Simple Product 2 With Options Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,simple2urlkey,Simple Product 2 Meta Title,"simple, product",Simple Product 2 Meta Description,/mediaimport/simple2.png,Base Image Label,/mediaimport/simple2.png,Small Image Label,/mediaimport/simple2.png,Thumbnail Image Label,"/mediaimport/simple2.png, /mediaimport/simple2a.png","Label Simple 2, Label Simple 2a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7","name=Custom Option One,type=dropdown,required=1,option_title=custom option 1; sku=sku-option1,price=10.00, price_type=fixed|name=Custom Option One,type=dropdown,required=1,option_title=custom option 2,sku=sku-option3,price=11.00,price_type=fixed","attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +</ul>",Simple Product 2 With Options Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,simple2urlkey,Simple Product 2 Meta Title,"simple, product",Simple Product 2 Meta Description,/mediaimport/simple2.png,Base Image Label,/mediaimport/simple2.png,Small Image Label,/mediaimport/simple2.png,Thumbnail Image Label,"/mediaimport/simple2.png, /mediaimport/simple2a.png","Label Simple 2, Label Simple 2a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7","name=Custom Option One,type=dropdown,required=1,option_title=custom option 1; sku=sku-option1,price=10.00, price_type=fixed|name=Custom Option One,type=dropdown,required=1,option_title=custom option 2,sku=sku-option3,price=11.00,price_type=fixed","attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 configurablesku1,base,default,default,configurable,Configurable Product 1,"<ul> <li>Line 1</li> <li>Line 2</li> <li>Line 3</li> <li>Configurable Product 1 Description</li> -</ul>",Configurable Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,configurable1urlkey,Configurable Product 1 Meta Title,"configurable, product",Configurable Product 1 Meta Description,/mediaimport/configurable1.png,Base Image Label,/mediaimport/configurable1.png,Small Image Label,/mediaimport/configurable1.png,Thumbnail Image Label,"/mediaimport/configurable1.png, /mediaimport/configurable1a.png","Label Configurable 1, Label Configurable 1a","color=Select Color, size=Select Size","sku=sku-red-xs,color=red,size=xs,price=10.99,display=1,image=http: -example.com/1.png|sku=sku-red-m,color=red,size=m,price=20.88,display=1,image=/example.com/2.png",,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +</ul>",Configurable Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,configurable1urlkey,Configurable Product 1 Meta Title,"configurable, product",Configurable Product 1 Meta Description,/mediaimport/configurable1.png,Base Image Label,/mediaimport/configurable1.png,Small Image Label,/mediaimport/configurable1.png,Thumbnail Image Label,"/mediaimport/configurable1.png, /mediaimport/configurable1a.png","Label Configurable 1, Label Configurable 1a","color=Select Color, size=Select Size","sku=sku-red-xs,color=red,size=xs,price=10.99,display=1,image=http: +example.com/1.png|sku=sku-red-m,color=red,size=m,price=20.88,display=1,image=/example.com/2.png",,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 bundlesku1,base,default,default,bundle,Bundle Product 1,"<ul> <li>Line 1</li> <li>Line 2</li> <li>Line 3</li> <li>Bundle Product 1 Description</li> -</ul>",Bundle Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,bundle1urlkey,Bundle Product 1 Meta Title,bundle product,Bundle Product 1 Meta Description,/mediaimport/bundle1.png,Base Image Label,/mediaimport/bundle1.png,Small Image Label,/mediaimport/bundle1.png,Thumbnail Image Label,"/mediaimport/bundle1.png, /mediaimport/bundle1a.png","Label Bundle 1, Label Bundle 1a",,,fixed,fixed,fixed,"name=Bundle Option One,type=dropdown,required=1,sku=sku-option1,price=10; price_type=fixed, default_qty=1, is_defaul=1 | -name=Bundle Option One,type=dropdown; required=1, sku=sku-option1,price=10, price_type=fixed, default_qty=1, is_defaul=1",,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +</ul>",Bundle Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,bundle1urlkey,Bundle Product 1 Meta Title,bundle product,Bundle Product 1 Meta Description,/mediaimport/bundle1.png,Base Image Label,/mediaimport/bundle1.png,Small Image Label,/mediaimport/bundle1.png,Thumbnail Image Label,"/mediaimport/bundle1.png, /mediaimport/bundle1a.png","Label Bundle 1, Label Bundle 1a",,,fixed,fixed,fixed,"name=Bundle Option One,type=dropdown,required=1,sku=sku-option1,price=10; price_type=fixed, default_qty=1, is_defaul=1 | +name=Bundle Option One,type=dropdown; required=1, sku=sku-option1,price=10, price_type=fixed, default_qty=1, is_defaul=1",,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 bundlesku2,base,default,default,bundle,Bundle Product 2,"<ul> <li>Line 1</li> <li>Line 2</li> <li>Line 3</li> <li>Bundle Product 2 Description</li> -</ul>",Bundle Product 2 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,bundle1urlkey,Bundle Product 2 Meta Title,bundle product,Bundle Product 2 Meta Description,/mediaimport/bundle1.png,Base Image Label,/mediaimport/bundle1.png,Small Image Label,/mediaimport/bundle2.png,Thumbnail Image Label,"/mediaimport/bundle2.png, /mediaimport/bundl2a.png","Label Bundle 2, Label Bundle 2a",,,dynamic,fixed,fixed,"name=Bundle Option One,type=dropdown,required=1,sku=sku-option1, default_qty=1, is_defaul=1| -name=Bundle Option One,type=dropdown; required=1, sku=sku-option1, default_qty=1",,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +</ul>",Bundle Product 2 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,bundle1urlkey,Bundle Product 2 Meta Title,bundle product,Bundle Product 2 Meta Description,/mediaimport/bundle1.png,Base Image Label,/mediaimport/bundle1.png,Small Image Label,/mediaimport/bundle2.png,Thumbnail Image Label,"/mediaimport/bundle2.png, /mediaimport/bundl2a.png","Label Bundle 2, Label Bundle 2a",,,dynamic,fixed,fixed,"name=Bundle Option One,type=dropdown,required=1,sku=sku-option1, default_qty=1, is_defaul=1| +name=Bundle Option One,type=dropdown; required=1, sku=sku-option1, default_qty=1",,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 groupedsku1,base,default,default,grouped,Grouped Product 1,"<ul> <li>Line 1</li> <li>Line 2</li> <li>Line 3</li> <li>Grouped Product 1 Description</li> -</ul>",Grouped Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,grouped1urlkey,Grouped Product 1 Meta Title,grouped product,Grouped Product 1 Meta Description,/mediaimport/grouped1.png,Base Image Label,/mediaimport/grouped1.png,Small Image Label,/mediaimport/grouped1.png,Thumbnail Image Label,"/mediaimport/grouped1.png, /mediaimport/grouped1a.png","Label grouped 1, Label grouped 1a",,,,,,,,,"sku-product1=5,sku-product2=1,sku-product3=3 ","sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +</ul>",Grouped Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,grouped1urlkey,Grouped Product 1 Meta Title,grouped product,Grouped Product 1 Meta Description,/mediaimport/grouped1.png,Base Image Label,/mediaimport/grouped1.png,Small Image Label,/mediaimport/grouped1.png,Thumbnail Image Label,"/mediaimport/grouped1.png, /mediaimport/grouped1a.png","Label grouped 1, Label grouped 1a",,,,,,,,,"sku-product1=5,sku-product2=1,sku-product3=3","sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 giftsku1,base,default,default,gift,Gift Product 1,"<ul> <li>Line 1</li> <li>Line 2</li> <li>Line 3</li> <li>Gift Product 1 Description</li> -</ul>",Gift Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,Gift1urlkey,Gift Product 1 Meta Title,"gift, product",Gift Product 1 Meta Description,/mediaimport/gift1.png,Base Image Label,/mediaimport/gift1.png,Small Image Label,/mediaimport/gift1.png,Thumbnail Image Label,"/mediaimport/gift1.png, /mediaimport/gift1a.png","Label Gift 1, Label Gift 1a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,virtual,"100.00, 200.00, 300.00",1,100,1000,3,1,Gift Card(s) Purchase (Default),3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +</ul>",Gift Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,Gift1urlkey,Gift Product 1 Meta Title,"gift, product",Gift Product 1 Meta Description,/mediaimport/gift1.png,Base Image Label,/mediaimport/gift1.png,Small Image Label,/mediaimport/gift1.png,Thumbnail Image Label,"/mediaimport/gift1.png, /mediaimport/gift1a.png","Label Gift 1, Label Gift 1a",,,,,,,,,,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 downloadblesku1,base,default,default,downloadble,Downloadble Product 1,"<ul> <li>Line 1</li> <li>Line 2</li> <li>Line 3</li> <li>Downloadble Product 1 Description</li> -</ul>",Downloadble Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.9900,89.9900,3/2/2015,3/2/2015,Taxable Goods,Downloadble1urlkey,Downloadble Product 1 Meta Title,"Downloadble, product",Downloadble Product 1 Meta Description,/mediaimport/Downloadble1.png,Base Image Label,/mediaimport/Downloadble1.png,Small Image Label,/mediaimport/Downloadble1.png,Thumbnail Image Label,"/mediaimport/Downloadble1.png, /mediaimport/Downloadble1a.png","Label Downloadble 1, Label Downloadble 1a",,,,,,,"group_title=Group Title Samples, title=Title 1, file=media/file.mp4,sortorder=1|group_title=Group Title, title=Title 2, url=media/file2.mp4,sortorder=0","group_title=Group Title Links, title=Title 1, price=10, downloads=unlimited, file=media/file.mp4,sortorder=1|group_title=Group Title, title=Title 2, price=10, downloads=unlimited, url=media/file2.mp4,sortorder=0",,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,0,,,,,,,,,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 +</ul>",Downloadble Product 1 Short Description,1.1,1,"catalog, search",base,Category1/SubCategory1|Category2/SubCategory2,99.99,89.99,3/2/2015,3/2/2015,Taxable Goods,Downloadble1urlkey,Downloadble Product 1 Meta Title,"Downloadble, product",Downloadble Product 1 Meta Description,/mediaimport/Downloadble1.png,Base Image Label,/mediaimport/Downloadble1.png,Small Image Label,/mediaimport/Downloadble1.png,Thumbnail Image Label,"/mediaimport/Downloadble1.png, /mediaimport/Downloadble1a.png","Label Downloadble 1, Label Downloadble 1a",,,,,,,"group_title=Group Title Samples, title=Title 1, file=media/file.mp4,sortorder=1|group_title=Group Title, title=Title 2, url=media/file2.mp4,sortorder=0","group_title=Group Title Links, title=Title 1, price=10, downloads=unlimited, file=media/file.mp4,sortorder=1|group_title=Group Title, title=Title 2, price=10, downloads=unlimited, url=media/file2.mp4,sortorder=0",,"sku1, sku2, sku5","sku1, sku2, sku6","sku1, sku2, sku7",,"attribute1_code=attribute1_value,attribute2_code=attribute2_value",1,1,1000,2,0,1,1,1000,1,0,0,0,3/2/2015,3/2/2015,3/2/2015,3/2/2015,Magento Blank,3/2/2015,4/2/2015,,1 columnt,Product Info Column,9,On Gesture,1 -- GitLab From 0a4630a4160403fc441101e4add18bf58a8e755d Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Mon, 15 Jun 2015 22:34:48 +0300 Subject: [PATCH 241/396] MAGNIMEX-6: composer.json update --- .../AdvancedPricingImportExport/composer.json | 14 +++++++------- composer.lock | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/composer.json b/app/code/Magento/AdvancedPricingImportExport/composer.json index 68dfacca050..c8b52c1509e 100644 --- a/app/code/Magento/AdvancedPricingImportExport/composer.json +++ b/app/code/Magento/AdvancedPricingImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta12", - "magento/module-import-export": "0.74.0-beta12", - "magento/module-catalog-import-export": "0.74.0-beta12", - "magento/module-customer": "0.74.0-beta12", - "magento/module-store": "0.74.0-beta12", - "magento/framework": "0.74.0-beta12", + "magento/module-catalog": "0.74.0-beta13", + "magento/module-import-export": "0.74.0-beta13", + "magento/module-catalog-import-export": "0.74.0-beta13", + "magento/module-customer": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta13", + "magento/framework": "0.74.0-beta13", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta12", + "version": "0.74.0-beta13", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/composer.lock b/composer.lock index 2436cff71f1..db18cd48639 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "55186e4b1650ca5f2ad865799800f636", + "hash": "c5a99caaa93f801e3c88e4923d377a7c", "packages": [ { "name": "composer/composer", -- GitLab From accbd54098398f5ca5c0e89e9c49e7d0b718d1dd Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Tue, 16 Jun 2015 00:44:13 +0300 Subject: [PATCH 242/396] MAGNIMEX-145: fix for non-existing column additional_images --- .../Model/Import/Product.php | 87 +++++++++++++------ 1 file changed, 62 insertions(+), 25 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index c0433570f2e..a1c98222956 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -1316,7 +1316,8 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity // 2. Product-to-Website phase if (!empty($rowData[self::COL_PRODUCT_WEBSITES])) { - $websites[$rowSku][$this->storeResolver->getWebsiteCodeToId($rowData[self::COL_PRODUCT_WEBSITES])] = true; + $websiteId = $this->storeResolver->getWebsiteCodeToId($rowData[self::COL_PRODUCT_WEBSITES]); + $websites[$rowSku][$websiteId] = true; } // 3. Categories phase @@ -1353,28 +1354,43 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity } // 5. Media gallery phase - $dispertionPath = \Magento\Framework\File\Uploader::getDispretionPath($rowData[self::COL_MEDIA_IMAGE]); - $imageName = preg_replace('/[^a-z0-9\._-]+/i','', $rowData[self::COL_MEDIA_IMAGE]); - $fullDispertionPath = $dispertionPath.'/'.$imageName; + + $fullDispersionPath = ''; $imageIsSet = null; $imageFromProduct = null; $imageInProductIsSet = null; - foreach ($this->cachedImages as $image) { - if ($image['sku'] == $rowData[self::COL_SKU] && preg_replace('/_[0-9]+/', '', $image['value']) == $fullDispertionPath) { - $imageInProductIsSet = true; - $imageFromProduct = preg_replace('/_[0-9]+/', '', $image['value']); - break; - } elseif (in_array($fullDispertionPath, $image)) { - $imageIsSet = true; - break; + if (!empty($rowData[self::COL_MEDIA_IMAGE])) { + $dispersionPath = + \Magento\Framework\File\Uploader::getDispretionPath($rowData[self::COL_MEDIA_IMAGE]); + $imageName = preg_replace('/[^a-z0-9\._-]+/i', '', $rowData[self::COL_MEDIA_IMAGE]); + $fullDispersionPath = $dispersionPath . '/' . $imageName; + foreach ($this->cachedImages as $image) { + if (($image['sku'] == $rowData[self::COL_SKU]) + && (preg_replace('/_[0-9]+/', '', $image['value']) == $fullDispersionPath) + ) { + $imageInProductIsSet = true; + $imageFromProduct = preg_replace('/_[0-9]+/', '', $image['value']); + break; + } elseif (in_array($fullDispersionPath, $image)) { + $imageIsSet = true; + break; + } } } - if (($imageInProductIsSet && $imageFromProduct != $fullDispertionPath) || (!isset($imageIsSet) && !isset($imageInProductIsSet))) { + if (($imageInProductIsSet && ($imageFromProduct != $fullDispersionPath)) + || (!isset($imageIsSet) && !isset($imageInProductIsSet)) + ) { $mediaGalleryImages = array(); $mediaGalleryLabels = array(); if (!empty($rowData[self::COL_MEDIA_IMAGE])) { - $mediaGalleryImages = explode($this->getMultipleValueSeparator(), $rowData[self::COL_MEDIA_IMAGE]); - $mediaGalleryLabels = isset($rowData['_media_image_label']) ? explode($this->getMultipleValueSeparator(), $rowData['_media_image_label']) : array(); + $mediaGalleryImages = + explode($this->getMultipleValueSeparator(), $rowData[self::COL_MEDIA_IMAGE]); + if (isset($rowData['_media_image_label'])) { + $mediaGalleryLabels = + explode($this->getMultipleValueSeparator(), $rowData['_media_image_label']); + } else { + $mediaGalleryLabels = []; + } if (count($mediaGalleryLabels) > count($mediaGalleryImages)) { $mediaGalleryLabels = array_slice($mediaGalleryLabels, 0, count($mediaGalleryImages)); } elseif (count($mediaGalleryLabels) < count($mediaGalleryImages)) { @@ -1383,9 +1399,15 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity } foreach ($this->_imagesArrayKeys as $imageCol) { - if (!empty($rowData[$imageCol]) && ($imageCol != self::COL_MEDIA_IMAGE) && !in_array($rowData[$imageCol], $mediaGalleryImages)) { + if (!empty($rowData[$imageCol]) + && ($imageCol != self::COL_MEDIA_IMAGE) + && !in_array($rowData[$imageCol], $mediaGalleryImages)) { $mediaGalleryImages[] = $rowData[$imageCol]; - $mediaGalleryLabels[] = isset($rowData[$imageCol . '_label']) ? $rowData[$imageCol . '_label'] : ''; + if (isset($mediaGalleryLabels)) { + $mediaGalleryLabels[] = isset($rowData[$imageCol . '_label']); + } else { + $mediaGalleryLabels[] = ''; + } } } @@ -1418,12 +1440,18 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity ]; } } - } elseif ($imageInProductIsSet && $imageFromProduct == $fullDispertionPath) { + } elseif ($imageInProductIsSet && $imageFromProduct == $fullDispersionPath) { $mediaGalleryImages = array(); $mediaGalleryLabels = array(); if (!empty($rowData[self::COL_MEDIA_IMAGE])) { - $mediaGalleryImages = explode($this->getMultipleValueSeparator(), $rowData[self::COL_MEDIA_IMAGE]); - $mediaGalleryLabels = isset($rowData['_media_image_label']) ? explode($this->getMultipleValueSeparator(), $rowData['_media_image_label']) : array(); + $mediaGalleryImages = + explode($this->getMultipleValueSeparator(), $rowData[self::COL_MEDIA_IMAGE]); + if (isset($rowData['_media_image_label'])) { + $mediaGalleryLabels = + explode($this->getMultipleValueSeparator(), $rowData['_media_image_label']); + } else { + $mediaGalleryLabels = array(); + } if (count($mediaGalleryLabels) > count($mediaGalleryImages)) { $mediaGalleryLabels = array_slice($mediaGalleryLabels, 0, count($mediaGalleryImages)); } elseif (count($mediaGalleryLabels) < count($mediaGalleryImages)) { @@ -1432,9 +1460,15 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity } foreach ($this->_imagesArrayKeys as $imageCol) { - if (!empty($rowData[$imageCol]) && ($imageCol != self::COL_MEDIA_IMAGE) && !in_array($rowData[$imageCol], $mediaGalleryImages)) { + if (!empty($rowData[$imageCol]) + && ($imageCol != self::COL_MEDIA_IMAGE) + && !in_array($rowData[$imageCol], $mediaGalleryImages)) { $mediaGalleryImages[] = $rowData[$imageCol]; - $mediaGalleryLabels[] = isset($rowData[$imageCol . '_label']) ? $rowData[$imageCol . '_label'] : ''; + if (isset($rowData[$imageCol . '_label'])) { + $mediaGalleryLabels[] = $rowData[$imageCol . '_label']; + } else { + $mediaGalleryLabels[] = ''; + } } } @@ -1450,7 +1484,6 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity } } else { $this->addRowError(__("Image already exists for '%s'"), $rowNum, self::COL_MEDIA_IMAGE); - } // 6. Attributes phase @@ -1479,7 +1512,8 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity $productTypeModel = $this->_productTypeModels[$productType]; if (!empty($rowData['tax_class_name'])) { - $rowData['tax_class_id'] = $this->taxClassProcessor->upsertTaxClass($rowData['tax_class_name'], $productTypeModel); + $rowData['tax_class_id'] = + $this->taxClassProcessor->upsertTaxClass($rowData['tax_class_name'], $productTypeModel); } if ($this->getBehavior() == \Magento\ImportExport\Model\Import::BEHAVIOR_APPEND || @@ -1563,7 +1597,10 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity $attributes ); - $this->_eventManager->dispatch('catalog_product_import_bunch_save_after', ['adapter' => $this, 'bunch' => $bunch]); + $this->_eventManager->dispatch( + 'catalog_product_import_bunch_save_after', + ['adapter' => $this, 'bunch' => $bunch] + ); } return $this; } -- GitLab From da2f15e4c3bc4244527dcc7f60068142191bb5c5 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Mon, 15 Jun 2015 23:41:25 -0500 Subject: [PATCH 243/396] MAGETWO-37981: Incorrect action name checks leads to customer info leak --- .../Controller/Adminhtml/Notification.php | 22 +---------- .../Adminhtml/Notification/MarkAsRead.php | 8 ++++ .../Adminhtml/Notification/MassMarkAsRead.php | 8 ++++ .../Adminhtml/Notification/MassRemove.php | 8 ++++ .../Adminhtml/Notification/Remove.php | 8 ++++ .../Sales/Controller/Adminhtml/Order.php | 39 +------------------ .../Controller/Adminhtml/Order/AddComment.php | 8 ++++ .../Controller/Adminhtml/Order/Address.php | 8 ++++ .../Adminhtml/Order/AddressSave.php | 8 ++++ .../Controller/Adminhtml/Order/Cancel.php | 8 ++++ .../Controller/Adminhtml/Order/Create.php | 2 +- .../Adminhtml/Order/Creditmemos.php | 8 ++++ .../Controller/Adminhtml/Order/Email.php | 8 ++++ .../Sales/Controller/Adminhtml/Order/Hold.php | 8 ++++ .../Adminhtml/Order/ReviewPayment.php | 8 ++++ .../Controller/Adminhtml/Order/Unhold.php | 8 ++++ .../Sales/Controller/Adminhtml/Order/View.php | 8 ++++ .../Controller/Adminhtml/Transactions.php | 9 +---- .../Adminhtml/Transactions/Fetch.php | 8 ++++ .../Controller/Adminhtml/Rate.php | 14 +------ .../Controller/Adminhtml/Rate/ExportPost.php | 13 +++++++ .../Adminhtml/Rate/ImportExport.php | 8 ++++ .../Controller/Adminhtml/Rate/ImportPost.php | 13 +++++++ 23 files changed, 159 insertions(+), 81 deletions(-) diff --git a/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php b/app/code/Magento/AdminNotification/Controller/Adminhtml/Notification.php index d1657ae076a..cd88e551ffe 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 ee93d06fc8c..bcf66825edf 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 ac414106f9f..78090163aa6 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 41a27163baa..4b0068520ba 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 53fc0bee4bf..b4fe7e0e295 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/Sales/Controller/Adminhtml/Order.php b/app/code/Magento/Sales/Controller/Adminhtml/Order.php index 4685341ddef..0bf5c59a46e 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 c88e58bfe00..92671b41080 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php @@ -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 0b5697e7c48..18fdf29cf80 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 6e0b2251ced..d50b6ce26fb 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php @@ -35,4 +35,12 @@ class AddressSave extends \Magento\Sales\Controller\Adminhtml\Order 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 54b3294c89d..263edb51310 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/Create.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php index 54fcd049b38..b8ebd6411ed 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php @@ -373,7 +373,7 @@ class Create extends \Magento\Backend\App\Action */ protected function _isAllowed() { - return $this->_authorization->isAllowed($this->_getAclResource()); + return $this->_authorization->isAllowed('Magento_Sales::actions'); } /** diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Creditmemos.php index 47634d33a81..46571b222f3 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 e83f6436f47..c2734867fcc 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php @@ -29,4 +29,12 @@ class Email extends \Magento\Sales\Controller\Adminhtml\Order } 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 3f295b391bd..58a54b87f0e 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/ReviewPayment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php index 83c87cd3c45..8da7123b5f8 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php @@ -53,4 +53,12 @@ class ReviewPayment extends \Magento\Sales\Controller\Adminhtml\Order $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/Unhold.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Unhold.php index 6ea9cd78e3b..c57f4ca4251 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 2242f7a6360..e4881766b1b 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/Transactions.php b/app/code/Magento/Sales/Controller/Adminhtml/Transactions.php index 49b910be6a8..f3d31df87ac 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 946b8e36fd6..d70f921a13a 100755 --- a/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Transactions/Fetch.php @@ -37,4 +37,12 @@ class Fetch extends \Magento\Sales\Controller\Adminhtml\Transactions $resultRedirect = $this->resultRedirectFactory->create(); 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/TaxImportExport/Controller/Adminhtml/Rate.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate.php index ba316fd6f73..3a09ea4b474 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 1d568580288..92e825650f8 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 5ba0b3e87da..b37520a99f8 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 663a0183b1e..eb5efff3d5e 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' + ); + + } } -- GitLab From 3a6c332b471a84d07d611a18b8774964f76d6bf7 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 16 Jun 2015 08:12:48 +0300 Subject: [PATCH 244/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - content for several modules was changed --- .../Adminhtml/Product/Attribute/Edit/Tab/Front.php | 2 +- .../Block/Adminhtml/Product/Attribute/Edit/Tabs.php | 4 ++-- .../Checkout/Controller/Cart/UpdateItemOptions.php | 2 +- app/code/Magento/Checkout/Model/Type/Onepage.php | 2 +- .../templates/onepage/shipping_method/available.phtml | 2 +- .../view/frontend/web/template/shipping-method.html | 2 +- .../Customer/Block/Adminhtml/Edit/Tab/Orders.php | 2 +- .../Customer/Block/Adminhtml/Edit/Tab/View/Orders.php | 2 +- .../Magento/Customer/Controller/Account/CreatePost.php | 2 +- .../view/frontend/templates/checkout/shipping.phtml | 2 +- .../Newsletter/Controller/Subscriber/Unsubscribe.php | 2 +- .../Magento/Payment/Model/Method/AbstractMethod.php | 2 +- app/code/Magento/Payment/Model/Method/Cc.php | 6 +++--- .../Model/Observer/PreventExpressCheckout.php | 2 +- .../view/frontend/templates/remember_me.phtml | 2 +- .../view/frontend/web/template/remember-me.html | 2 +- app/code/Magento/ProductAlert/Controller/Add/Price.php | 2 +- app/code/Magento/ProductAlert/Controller/Add/Stock.php | 2 +- .../ProductAlert/Controller/Unsubscribe/Price.php | 2 +- .../ProductAlert/Controller/Unsubscribe/Stock.php | 2 +- .../view/frontend/templates/email/price.phtml | 4 ++-- .../view/frontend/templates/email/stock.phtml | 4 ++-- .../Magento/Reports/Block/Adminhtml/Filter/Form.php | 2 +- .../Reports/Block/Adminhtml/Grid/AbstractGrid.php | 2 +- .../Adminhtml/Report/Statistics/RefreshLifetime.php | 2 +- .../view/adminhtml/layout/reports_report_grid.xml | 4 ++-- .../adminhtml/layout/reports_report_product_viewed.xml | 2 +- .../adminhtml/layout/reports_report_sales_coupons.xml | 6 +++--- .../adminhtml/layout/reports_report_sales_invoiced.xml | 2 +- .../adminhtml/layout/reports_report_sales_refunded.xml | 2 +- .../adminhtml/layout/reports_report_sales_sales.xml | 6 +++--- .../adminhtml/layout/reports_report_sales_shipping.xml | 2 +- .../view/adminhtml/layout/reports_report_sales_tax.xml | 6 +++--- .../layout/reports_report_statistics_index.xml | 4 ++-- .../Reports/view/adminhtml/layout/reports_sales.xml | 2 +- app/code/Magento/Review/Block/Adminhtml/Add.php | 2 +- app/code/Magento/Review/Block/Adminhtml/Add/Form.php | 2 +- app/code/Magento/Review/Block/Adminhtml/Edit/Form.php | 4 ++-- app/code/Magento/Review/Block/Adminhtml/Main.php | 2 +- .../Review/Block/Adminhtml/Rating/Edit/Tab/Form.php | 2 +- app/code/Magento/Review/Block/Adminhtml/Rss.php | 2 +- .../Controller/Adminhtml/Product/JsonProductInfo.php | 2 +- .../Review/Controller/Adminhtml/Product/MassDelete.php | 2 +- .../Controller/Adminhtml/Product/MassUpdateStatus.php | 2 +- .../Controller/Adminhtml/Product/MassVisibleIn.php | 2 +- .../Review/Controller/Adminhtml/Product/Post.php | 2 +- app/code/Magento/Review/Controller/Product/Post.php | 6 +++--- app/code/Magento/Review/Model/Review.php | 6 +++--- .../Review/Test/Unit/Controller/Product/PostTest.php | 2 +- .../Magento/Review/view/frontend/templates/form.phtml | 2 +- app/code/Magento/Rule/Model/AbstractModel.php | 6 +++--- .../Rule/Model/Condition/Product/AbstractProduct.php | 2 +- app/code/Magento/Rule/view/adminhtml/web/rules.js | 2 +- .../Sales/Block/Adminhtml/Items/AbstractItems.php | 2 +- .../Sales/Block/Adminhtml/Order/AbstractOrder.php | 2 +- .../Sales/Block/Adminhtml/Order/Creditmemo/View.php | 6 +++--- .../Sales/Block/Adminhtml/Order/Invoice/View.php | 6 +++--- .../Sales/Block/Adminhtml/Order/Status/Assign/Form.php | 2 +- .../Magento/Sales/Block/Adminhtml/Order/View/Tabs.php | 2 +- .../Adminhtml/Creditmemo/AbstractCreditmemo/Email.php | 2 +- .../Adminhtml/Invoice/AbstractInvoice/Email.php | 2 +- .../Sales/Controller/Adminhtml/Order/AddComment.php | 2 +- .../Sales/Controller/Adminhtml/Order/AddressSave.php | 2 +- .../Adminhtml/Order/Creditmemo/AddComment.php | 2 +- .../Controller/Adminhtml/Order/Creditmemo/Save.php | 4 ++-- .../Adminhtml/Order/Creditmemo/UpdateQty.php | 2 +- .../Controller/Adminhtml/Order/CreditmemoLoader.php | 2 +- .../Magento/Sales/Controller/Adminhtml/Order/Email.php | 2 +- .../Controller/Adminhtml/Order/Invoice/AddComment.php | 2 +- .../Controller/Adminhtml/Order/Invoice/NewAction.php | 2 +- .../Sales/Controller/Adminhtml/Order/Invoice/Save.php | 10 +++++----- .../Controller/Adminhtml/Order/Invoice/UpdateQty.php | 2 +- .../Sales/Controller/Adminhtml/Order/ReviewPayment.php | 2 +- .../Controller/Adminhtml/Order/Status/AssignPost.php | 4 ++-- .../Sales/Controller/Adminhtml/Order/Status/Save.php | 4 ++-- .../Controller/Adminhtml/Order/Status/Unassign.php | 2 +- .../Sales/Controller/Adminhtml/Order/VoidPayment.php | 2 +- app/code/Magento/Sales/Model/AdminOrder/Create.php | 8 ++++---- .../Magento/Sales/Model/Order/Payment/Transaction.php | 2 +- app/code/Magento/Sales/Model/Order/Shipment/Item.php | 2 +- .../Block/Adminhtml/Order/Status/Assign/FormTest.php | 2 +- .../Creditmemo/AbstractCreditmemo/EmailTest.php | 2 +- .../Adminhtml/Invoice/AbstractInvoice/EmailTest.php | 2 +- .../Adminhtml/Order/Creditmemo/AddCommentTest.php | 2 +- .../Controller/Adminhtml/Order/Creditmemo/SaveTest.php | 2 +- .../Adminhtml/Order/Creditmemo/UpdateQtyTest.php | 2 +- .../view/adminhtml/layout/sales_order_grid_block.xml | 2 +- .../view/adminhtml/layout/sales_order_status_index.xml | 2 +- .../view/adminhtml/templates/order/comments/view.phtml | 2 +- .../adminhtml/templates/order/create/items/grid.phtml | 4 ++-- .../view/adminhtml/templates/order/view/history.phtml | 2 +- .../view/adminhtml/templates/order/view/info.phtml | 4 ++-- .../Controller/Adminhtml/Order/Shipment/AddComment.php | 2 +- .../Adminhtml/Order/Shipment/RemoveTrack.php | 5 ++++- .../Adminhtml/Order/Shipment/RemoveTrackTest.php | 2 +- .../Block/Adminhtml/Widget/Instance/Edit/Tab/Main.php | 6 +++--- .../Constraint/AssertReviewCreationSuccessMessage.php | 2 +- .../AssertOrderStatusSuccessAssignMessage.php | 2 +- .../AssertOrderStatusSuccessCreateMessage.php | 2 +- .../testsuite/Magento/Catalog/_files/categories.php | 2 +- .../Magento/Customer/Controller/AccountTest.php | 2 +- .../Magento/Sales/Controller/Adminhtml/OrderTest.php | 2 +- 102 files changed, 143 insertions(+), 140 deletions(-) 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 c974a84d624..12efe7691e4 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( 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 52ba2586a6f..45a95f5f010 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/Checkout/Controller/Cart/UpdateItemOptions.php b/app/code/Magento/Checkout/Controller/Cart/UpdateItemOptions.php index 83b56954111..f8519d2ee57 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/Model/Type/Onepage.php b/app/code/Magento/Checkout/Model/Type/Onepage.php index ff24c18f2be..e31279bc409 100644 --- a/app/code/Magento/Checkout/Model/Type/Onepage.php +++ b/app/code/Magento/Checkout/Model/Type/Onepage.php @@ -907,7 +907,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>.', + 'Account confirmation is required. Please check your email for confirmation link. To resend confirmation email please <a href="%1">click here</a>.', $url ) // @codingStandardsIgnoreEnd 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 257d8bab74f..439778300fa 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/web/template/shipping-method.html b/app/code/Magento/Checkout/view/frontend/web/template/shipping-method.html index 3bb9342bc57..523c1eb3b34 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/Customer/Block/Adminhtml/Edit/Tab/Orders.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/Orders.php index b7aafdd4032..8387043fc15 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/Orders.php b/app/code/Magento/Customer/Block/Adminhtml/Edit/Tab/View/Orders.php index a2750d15538..adc9caffbf0 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/Controller/Account/CreatePost.php b/app/code/Magento/Customer/Controller/Account/CreatePost.php index c132eb904d1..ba68dcb6536 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>.', + 'Account confirmation is required. Please check your email for the confirmation link. To resend the confirmation email please <a href="%1">click here</a>.', $email ) ); 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 105b8b416e6..95f29ab4010 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/Newsletter/Controller/Subscriber/Unsubscribe.php b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php index bb28a220d87..8071f16b452 100644 --- a/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php +++ b/app/code/Magento/Newsletter/Controller/Subscriber/Unsubscribe.php @@ -20,7 +20,7 @@ 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) { diff --git a/app/code/Magento/Payment/Model/Method/AbstractMethod.php b/app/code/Magento/Payment/Model/Method/AbstractMethod.php index c9bc85c757d..14bfeb583c4 100644 --- a/app/code/Magento/Payment/Model/Method/AbstractMethod.php +++ b/app/code/Magento/Payment/Model/Method/AbstractMethod.php @@ -670,7 +670,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 dd8bd650bc7..9f84700d7da 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/Persistent/Model/Observer/PreventExpressCheckout.php b/app/code/Magento/Persistent/Model/Observer/PreventExpressCheckout.php index 6b2614c23a2..e6f0f3a7a74 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/view/frontend/templates/remember_me.phtml b/app/code/Magento/Persistent/view/frontend/templates/remember_me.phtml index 0546274aaf1..24542d32a06 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 086ba1e3b1a..12ebb8ec864 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 9e1a6d21fb2..7ee60ebf799 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 c0a5ff8801c..ea0cb55cc15 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 0f2c5334a09..46ba80f4b3a 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 703bb606f16..3052fcfe0ab 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 19a060cd4c2..f0e9c131837 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 afe06fa6ed8..7c2a812b970 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/Reports/Block/Adminhtml/Filter/Form.php b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php index 7c18123b5fa..f786c95ab8b 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php @@ -127,7 +127,7 @@ 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/AbstractGrid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php index 68b0b78bbbd..a8507b2bc51 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php @@ -82,7 +82,7 @@ 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.')); } /** 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 119375fb9ca..35222afc53a 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/view/adminhtml/layout/reports_report_grid.xml b/app/code/Magento/Reports/view/adminhtml/layout/reports_report_grid.xml index 9bed8390ecb..ec35449c548 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 a6934ca9a62..fd28a5b1e15 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 9fad06da5ac..d9492bf1328 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 abeb8254e92..ad48c082cfe 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 7191b7bae09..174cbb1960d 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 20c787a6010..b4ce0c4f80a 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 3093e769e52..c959aef4d9c 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 96fecf243b9..09b29d40257 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 38f42a0c5b7..23ae6eece72 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 3b1c1e58ef6..e0f2f895b51 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 448ae442a99..95d67d47650 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 ef18b578691..92b8ba3a926 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 e5904fd543c..14abe1ebe92 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 cdad4bd6d3a..513d0bd1179 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 57989416a51..ac13b56d00b 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 42f9ef5583d..c1b6724e142 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 c3f6aac9880..0e6cf178d82 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 0783cec7e24..d9e43c07b5f 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 record(s).')); } } /** @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 422806f2a6f..285503a2365 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 5dbd33f8ee8..4e65891133a 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 6a332eb52ef..f6b7f24bffd 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 56260350b87..a68f0d18c3b 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 63405dde14c..b68d7fc1d12 100644 --- a/app/code/Magento/Review/Model/Review.php +++ b/app/code/Magento/Review/Model/Review.php @@ -263,15 +263,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)) { 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 5d1c1884335..9cedb87e15a 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/view/frontend/templates/form.phtml b/app/code/Magento/Review/view/frontend/templates/form.phtml index 958cbe2e1de..9d98fdeef3d 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 8aedb81590e..6f4cebc0536 100644 --- a/app/code/Magento/Rule/Model/AbstractModel.php +++ b/app/code/Magento/Rule/Model/AbstractModel.php @@ -107,7 +107,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.')); } } @@ -373,13 +373,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.'); } } diff --git a/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php b/app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php index 79c0ebe18c8..8b2df7adff1 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/view/adminhtml/web/rules.js b/app/code/Magento/Rule/view/adminhtml/web/rules.js index 066ef829a27..262d155a53c 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 b1b0a7de53b..8706e8b63cc 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php @@ -227,7 +227,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 20fc1d42baa..0539d5cb195 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 b83a8eb2ef0..39ed7ecbf7b 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 was not 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 eb1570d96db..45e1eeb888f 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 was not 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 f99d6e2e6ea..b27fa8fdb16 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 4f1ce86eafb..b8ecb49e9a4 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/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Creditmemo/AbstractCreditmemo/Email.php index 34dc5bbb8af..98a3b5200f7 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 99e666227ef..8436c8f1ceb 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/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php index c88e58bfe00..335f5a7a588 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 comment text.')); } $notify = isset($data['is_customer_notified']) ? $data['is_customer_notified'] : false; diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php index 6e0b2251ced..fc174f97b8b 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddressSave.php @@ -28,7 +28,7 @@ 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 { 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 832aed45797..5fb2397783f 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 Comment Text.') ); } $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 dbbd9dd55e3..b9eff656be6 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 1757fdfb802..38068b10918 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 4468f01f7e6..c40b1b99506 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/Email.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php index e83f6436f47..df614ba7c44 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Email.php @@ -22,7 +22,7 @@ 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()]); 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 74011a35d81..c0d5da182cc 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 Comment Text.')); } $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 f7db6d19da3..b0a7f1ed4d2 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 3758ad060f0..a30fcb59b99 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 38d563101cb..85c51e09343 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 83c87cd3c45..67c5924940a 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/ReviewPayment.php @@ -47,7 +47,7 @@ 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()]); 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 43cc5fd46cd..a77c6dc3cc6 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 65535942a16..efd73d7a2b3 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 6debca9cf31..e44b4f5e48e 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/VoidPayment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/VoidPayment.php index 86b1af24af0..f3c2f2cee9d 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/Model/AdminOrder/Create.php b/app/code/Magento/Sales/Model/AdminOrder/Create.php index a661297a73a..ff8126c3342 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 17b73b17d60..5d7a2efedd9 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 6197a179feb..381f7e5907b 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/Test/Unit/Block/Adminhtml/Order/Status/Assign/FormTest.php b/app/code/Magento/Sales/Test/Unit/Block/Adminhtml/Order/Status/Assign/FormTest.php index 9e1a5575328..b2f1555a3fc 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 bd9b80e880e..09554226bc3 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 8493e58d858..994cfca6db4 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 b7b8759dfc4..f0985a0eaf9 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 Comment Text.'; $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 f834d01d208..5549ee7f193 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 7b6c366e5ec..9e02c98b1c3 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/view/adminhtml/layout/sales_order_grid_block.xml b/app/code/Magento/Sales/view/adminhtml/layout/sales_order_grid_block.xml index 50b483c1a82..2af914b40b2 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 1403dd31584..5ea17f70a37 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 a1e1c4b2ee3..1d3eb30bd03 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/items/grid.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/create/items/grid.phtml index 6096ab772d2..35000ce39f1 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/view/history.phtml b/app/code/Magento/Sales/view/adminhtml/templates/order/view/history.phtml index 0a681e6c628..17d163c1f7d 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 f27dc9bd434..c7881ea98ce 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/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php index c1fdc5ecd88..1fb2e58610f 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 Comment Text.') ); } $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); 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 2e22b97509a..c603c2a9436 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php @@ -68,7 +68,10 @@ class RemoveTrack extends \Magento\Backend\App\Action $response = ['error' => true, 'message' => __('Cannot 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 3e05141a08b..9b6169a7744 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') 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 23b609a0e5b..d281c60358d 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/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertReviewCreationSuccessMessage.php index d9c1c718ab5..a5b7e25733f 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 8e7331ff5c9..b20839bba30 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 486b801dbed..0e6e63eb9f1 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/integration/testsuite/Magento/Catalog/_files/categories.php b/dev/tests/integration/testsuite/Magento/Catalog/_files/categories.php index 4c339630267..7662e16af82 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/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php index ad67b6d54c8..d3ecf74a8e2 100644 --- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php @@ -194,7 +194,7 @@ 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. ' . + '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>.', 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 bb770aca97b..19216e4265a 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php @@ -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 comment text."}' ] ]; } -- GitLab From bb81f56230207adaaa6613524951426e397d2d80 Mon Sep 17 00:00:00 2001 From: Vitaliy Honcharenko <vgoncharenko@ebay.com> Date: Tue, 16 Jun 2015 11:08:36 +0300 Subject: [PATCH 245/396] MTA-2324: Cms module functional tests maintenance - change fail on bamboo --- .../Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml index f421c7ec4a7..a549ca390d6 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageEntityTest.xml @@ -9,7 +9,7 @@ <testCase name="Magento\Cms\Test\TestCase\CreateCmsPageEntityTest"> <variation name="CreateCmsPageEntityTestVariation1"> <data name="description" xsi:type="string">MAGETWO-12399: Create CMS Content Page</data> - <data name="fixtureType" xsi:type="string">cms</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> <data name="data/identifier" xsi:type="string">identifier-%isolation%</data> <data name="data/store_id" xsi:type="string">All Store Views</data> @@ -21,7 +21,7 @@ </variation> <variation name="CreateCmsPageEntityTestVariation2"> <data name="description" xsi:type="string">Create page for default store view</data> - <data name="fixtureType" xsi:type="string">cms</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> @@ -30,7 +30,7 @@ </variation> <variation name="CreateCmsPageEntityTestVariation3"> <data name="description" xsi:type="string">Create page with widget and system variable</data> - <data name="fixtureType" xsi:type="string">cms</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> <data name="data/content/content" xsi:type="string">cms_page_text_content%isolation%</data> @@ -43,7 +43,7 @@ </variation> <variation name="CreateCmsPageEntityTestVariation4"> <data name="description" xsi:type="string">Create disabled page</data> - <data name="fixtureType" xsi:type="string">cms</data> + <data name="fixtureType" xsi:type="string">cmsPage</data> <data name="data/title" xsi:type="string">NewCmsPage%isolation%</data> <data name="data/store_id" xsi:type="string">Main Website/Main Website Store/Default Store View</data> <data name="data/is_active" xsi:type="string">Disabled</data> -- GitLab From 9314af4cb666c696447dfce541396bea846dfde0 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Tue, 16 Jun 2015 11:48:08 +0300 Subject: [PATCH 246/396] MAGETWO-38156: Move gift message to cart --- .../GiftMessage/view/frontend/web/js/model/gift-message.js | 5 ++++- .../GiftMessage/view/frontend/web/template/gift-message.html | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) 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 6dc0a0f8f97..801d895fef5 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 @@ -85,7 +85,10 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], var params = {}, self = this; _.each(this.submitParams, function(key) { - params[key] = provider[self.getUniqueKey(self.id, key)](); + var observable = provider[self.getUniqueKey(self.id, key)]; + if (_.isFunction(observable)) { + params[key] = observable(); + } }); if(this.additionalOptions.length) { 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 index 728310153af..cfab2bf3974 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -12,7 +12,7 @@ <div class="title" data-role="title" data-bind="click: $data.toggleFormBlockVisibility.bind($data)"> <span data-bind="text: $t('Gift options')"></span> </div> - <div class="" data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> <!-- from class content should be deleted style display none --> + <div data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> <!-- ko ifnot: resultBlockVisibility() --> <div class="gift-options"> <!-- ko foreach: getRegion('additionalOptions') --> -- GitLab From 133d35bfa4fc7a3023c866d5fe0c99554e051cc0 Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Tue, 16 Jun 2015 12:30:42 +0300 Subject: [PATCH 247/396] MAGETWO-38158: Pre-populate Zip/State/Country and make automatic estimation --- app/code/Magento/Checkout/Block/Cart/Shipping.php | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/code/Magento/Checkout/Block/Cart/Shipping.php b/app/code/Magento/Checkout/Block/Cart/Shipping.php index 8be6a01e725..f4a5b4ebf3c 100644 --- a/app/code/Magento/Checkout/Block/Cart/Shipping.php +++ b/app/code/Magento/Checkout/Block/Cart/Shipping.php @@ -360,22 +360,16 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart */ protected function _beforeToHtml() { - if ($customerId = $this->_customerSession->getCustomerId()) { - $customer = $this->customerRepository->getById($customerId); + if ($this->_customerSession->isLoggedIn()) { + $customer = $this->customerRepository->getById($this->_customerSession->getCustomerId()); if ($defaultShipping = $customer->getDefaultShipping()) { $address = $this->addressRepository->getById($defaultShipping); - if ($address && - ($address->getCountryId() - || $address->getPostcode() - || $address->getRegion() - || $address->getRegionId() - ) - ) { + if ($address) { /** @var \Magento\Quote\Api\Data\EstimateAddressInterface $estimatedAddress */ $estimatedAddress = $this->estimatedAddressFactory->create(); $estimatedAddress->setCountryId($address->getCountryId()); $estimatedAddress->setPostcode($address->getPostcode()); - $estimatedAddress->setRegion($address->getRegion()); + $estimatedAddress->setRegion((string)$address->getRegion()->getRegion()); $estimatedAddress->setRegionId($address->getRegionId()); $this->shippingMethodManager->estimateByAddress($this->getQuote()->getId(), $estimatedAddress); $this->quoteRepository->save($this->getQuote()); -- GitLab From 99808018e0ea744b5d276accfc4f9a11f6cfb764 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Tue, 16 Jun 2015 15:08:09 +0300 Subject: [PATCH 248/396] MAGETWO-38156: Move gift message to cart --- .../web/template/gift-message-item-level.html | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) 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 index bccd7976fd2..9b5bc9e2749 100644 --- 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 @@ -22,34 +22,33 @@ <!-- ko template: formTemplate --><!--/ko--> </div> <!-- /ko --> - <div class="gift-summary"> - <!-- ko if: resultBlockVisibility() --> - <!-- ko foreach: getRegion('additionalOptions') --> - <!--ko template: appliedTemplate --><!-- /ko --> - <!-- /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 style="font-weight: bolder" data-bind="text: $t('Message') + ':'"></span> - <!-- ko text: getObservable('message') --><!-- /ko --> + <!-- ko if: getObservable('message') --> + <div class="gift-message-summary"> + <span style="font-weight: bolder" 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> - <!-- /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> - <!-- /ko --> - </div> + </div> + <!-- /ko --> </div> <!-- /ko --> -- GitLab From a4ddf107366d26e7124c7b0c8d1cdefbc8f93caf Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Tue, 16 Jun 2015 15:11:12 +0300 Subject: [PATCH 249/396] MAGETWO-38158: Pre-populate Zip/State/Country and make automatic estimation --- .../Test/Unit/Block/Cart/ShippingTest.php | 410 +++++++++++++++++- 1 file changed, 388 insertions(+), 22 deletions(-) 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 fcb3e58c804..2f7a40a494f 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,213 @@ */ 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; + 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; + + /** @var Layout |\PHPUnit_Framework_MockObject_MockObject */ + protected $layout; + + /** @var EventManager |\PHPUnit_Framework_MockObject_MockObject */ + protected $eventManager; - protected $shippingBlock; + /** @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 +235,199 @@ 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') - ->disableOriginalConstructor() - ->setMethods(['getLayout']) - ->getMock(); + $this->assertEquals($shippingPriceHtml, $this->model->getShippingPriceHtml($shippingRateMock)); + } - $contextMock->expects($this->once()) - ->method('getLayout') - ->will($this->returnValue($layoutMock)); + public function testBeforeToHtmlCustomerNotLoggedIn() + { + $this->eventManager->expects($this->once()) + ->method('dispatch') + ->with('view_block_abstract_to_html_before', ['block' => $this->model]) + ->willReturnSelf(); - /** @var \Magento\Checkout\Block\Cart\Shipping $shippingBlock */ - $shippingBlock = $this->objectManager->getObject( - 'Magento\Checkout\Block\Cart\Shipping', - ['context' => $contextMock] - ); + $this->scopeConfig->expects($this->once()) + ->method('getValue') + ->with('advanced/modules_disable_output/Magento_Checkout', ScopeInterface::SCOPE_STORE) + ->willReturn(false); - $this->assertEquals($shippingPriceHtml, $shippingBlock->getShippingPriceHtml($shippingRateMock)); + $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 + */ + 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], + ]; + } + } -- GitLab From 515037a84267e7b6aa887234201b5138934883ee Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Tue, 16 Jun 2015 15:28:18 +0300 Subject: [PATCH 250/396] MAGETWO-38158: Pre-populate Zip/State/Country and make automatic estimation --- app/code/Magento/Checkout/Block/Cart/Shipping.php | 4 ++++ .../Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Checkout/Block/Cart/Shipping.php b/app/code/Magento/Checkout/Block/Cart/Shipping.php index f4a5b4ebf3c..738f70bdb78 100644 --- a/app/code/Magento/Checkout/Block/Cart/Shipping.php +++ b/app/code/Magento/Checkout/Block/Cart/Shipping.php @@ -12,6 +12,9 @@ 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 { /** @@ -86,6 +89,7 @@ class Shipping extends \Magento\Checkout\Block\Cart\AbstractCart * @param CustomerRepositoryInterface $customerRepository * @param QuoteRepository $quoteRepository * @param array $data + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\View\Element\Template\Context $context, 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 2f7a40a494f..bdb9d4789a2 100644 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php @@ -25,6 +25,10 @@ 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 Shipping */ @@ -310,6 +314,7 @@ class ShippingTest extends \PHPUnit_Framework_TestCase * @param int $regionId * @param int $quoteId * @dataProvider dataProviderBeforeToHtml + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testBeforeToHtml( $customerId, @@ -429,5 +434,4 @@ class ShippingTest extends \PHPUnit_Framework_TestCase [1, 1, 1, '12345', 'California', 1, 1], ]; } - } -- GitLab From 1a6424c44f7229408391e687b4296a63e54682bd Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 16 Jun 2015 15:37:27 +0300 Subject: [PATCH 251/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - fixed tests --- app/code/Magento/Payment/Model/Method/AbstractMethod.php | 8 ++++++++ .../Magento/Sales/Block/Adminhtml/Items/AbstractItems.php | 1 + 2 files changed, 9 insertions(+) diff --git a/app/code/Magento/Payment/Model/Method/AbstractMethod.php b/app/code/Magento/Payment/Model/Method/AbstractMethod.php index 14bfeb583c4..aace0f37536 100644 --- a/app/code/Magento/Payment/Model/Method/AbstractMethod.php +++ b/app/code/Magento/Payment/Model/Method/AbstractMethod.php @@ -586,6 +586,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function order(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -603,6 +604,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function authorize(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -620,6 +622,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function capture(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -638,6 +641,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function refund(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -653,6 +657,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @param \Magento\Framework\Object|InfoInterface $payment * @return $this * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function cancel(\Magento\Payment\Model\InfoInterface $payment) { @@ -666,6 +671,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function void(\Magento\Payment\Model\InfoInterface $payment) { @@ -692,6 +698,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return false * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function acceptPayment(InfoInterface $payment) { @@ -708,6 +715,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return false * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function denyPayment(InfoInterface $payment) { diff --git a/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php b/app/code/Magento/Sales/Block/Adminhtml/Items/AbstractItems.php index 8706e8b63cc..dc79dd5a7de 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 { -- GitLab From feb413161abf7cfc969dcdfe26212c5f84ef50aa Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Tue, 16 Jun 2015 15:46:14 +0300 Subject: [PATCH 252/396] MAGETWO-38156: Move gift message to cart --- .../GiftMessage/view/frontend/web/js/action/gift-options.js | 5 ++--- .../GiftMessage/view/frontend/web/js/model/gift-message.js | 6 +++--- .../GiftMessage/view/frontend/web/js/view/gift-message.js | 3 +-- 3 files changed, 6 insertions(+), 8 deletions(-) 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 index c846d399a07..4896aeb00b5 100644 --- 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 @@ -12,7 +12,7 @@ define( ], function(urlBuilder, storage, errorList, url) { "use strict"; - var result = function(giftMessage) { + return function(giftMessage, remove) { url.setBaseUrl(giftMessage.getConfigValue('baseUrl')); var quoteId = giftMessage.getConfigValue('quoteId'); var serviceUrl; @@ -35,7 +35,7 @@ define( storage.post( serviceUrl, JSON.stringify({ - gift_message: giftMessage.getSubmitParams() + gift_message: giftMessage.getSubmitParams(remove) }) ).done( function(result) { @@ -53,6 +53,5 @@ define( } ); }; - return result; } ); 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 801d895fef5..58122cdd177 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 @@ -81,13 +81,13 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], }); return callbacks; }, - getSubmitParams: function() { + 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] = observable(); + params[key] = remove ? null : observable(); } }); @@ -98,7 +98,7 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], if (_.isFunction(option.getSubmitParams)) { params['extension_attributes'] = _.extend( params['extension_attributes'], - option.getSubmitParams(self.itemId) + option.getSubmitParams(remove) ); } }); 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 index 0fc5cf395d9..70a563cc301 100644 --- 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 @@ -54,8 +54,7 @@ define(['uiComponent', '../model/gift-message', '../model/gift-options', '../act this.formBlockVisibility(true); }, deleteOptions: function() { - this.model.reset(); - giftOptionsService(this.model); + giftOptionsService(this.model, true); }, hideFormBlock: function() { this.formBlockVisibility(false); -- GitLab From f1bccb28e377e9e2d9c44c379f5044e9324fd032 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Tue, 16 Jun 2015 16:11:42 +0300 Subject: [PATCH 253/396] MAGETWO-38269: PR preparation & processing - Cms page test fixes --- .../Ui/view/base/web/js/grid/columns/actions.js | 10 ++++++---- .../app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js index 9cffc4b24d0..733fe3a46fb 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js @@ -15,7 +15,9 @@ define([ defaults: { bodyTmpl: 'ui/grid/cells/actions', actions: [], - templates: {}, + templates: { + actions: {} + }, rowsProvider: '${ $.parentName }', imports: { rows: '${ $.rowsProvider }:rows' @@ -42,7 +44,7 @@ define([ * or all action objects associated with it. * * @param {Number} rowIndex - Index of a row. - * @param {String} [actionIndex] + * @param {String} [actionIndex] - Action identifier. * @returns {Array|Object} */ getAction: function (rowIndex, actionIndex) { @@ -107,9 +109,9 @@ define([ * @returns {Array} */ _formatActions: function (row, rowIndex) { - var rowActions = row[this.index], + var rowActions = row[this.index] || {}, recordId = row[this.indexField], - customActions = this.templates.customActions; + customActions = this.templates.actions; /** * Actions iterator. diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php b/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php index 2cbcc56f34d..53402d17d2a 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/Block/Adminhtml/Page/Grid.php @@ -83,7 +83,6 @@ class Grid extends DataGrid if ($rowItem->isVisible()) { $rowItem->find('.action-select')->click(); $rowItem->find(sprintf($this->previewCmsPage, $itemName), Locator::SELECTOR_XPATH)->click(); - $this->waitForElement(); } else { throw new \Exception('Searched item was not found.'); } -- GitLab From bb204ca65c5daf55d54465a8422fa4dd3ffabf10 Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Tue, 16 Jun 2015 16:33:29 +0300 Subject: [PATCH 254/396] MAGETWO-38159: Hide Country dropdown for one country merchant --- app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7f07c470b04..13fbfbc990b 100644 --- a/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php +++ b/app/code/Magento/Checkout/Test/Unit/Block/Cart/ShippingTest.php @@ -468,5 +468,5 @@ class ShippingTest extends \PHPUnit_Framework_TestCase [1, false], [2, true], ]; - } + } } -- GitLab From 83d073af40f81ab47c10c81747396f7eabc86441 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Tue, 16 Jun 2015 16:45:58 +0300 Subject: [PATCH 255/396] MAGETWO-38156: Move gift message to cart --- .../Model/GiftMessageConfigProvider.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index 15a023a818b..1ce0d84859a 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -10,6 +10,7 @@ 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; /** * Configuration provider for GiftMessage rendering on "Shipping Method" step of checkout. @@ -41,6 +42,11 @@ class GiftMessageConfigProvider implements ConfigProviderInterface */ protected $storeManager; + /** + * @var LocaleFormat + */ + protected $localeFormat; + /** * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository @@ -48,6 +54,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface * @param \Magento\Checkout\Model\Session $checkoutSession * @param HttpContext $httpContext * @param \Magento\Store\Model\StoreManagerInterface $storeManager + * @param LocaleFormat $localeFormat */ public function __construct( \Magento\Framework\App\Helper\Context $context, @@ -55,7 +62,8 @@ class GiftMessageConfigProvider implements ConfigProviderInterface \Magento\GiftMessage\Api\ItemRepositoryInterface $itemRepository, \Magento\Checkout\Model\Session $checkoutSession, HttpContext $httpContext, - \Magento\Store\Model\StoreManagerInterface $storeManager + \Magento\Store\Model\StoreManagerInterface $storeManager, + LocaleFormat $localeFormat ) { $this->scopeConfiguration = $context->getScopeConfig(); $this->cartRepository = $cartRepository; @@ -63,6 +71,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface $this->checkoutSession = $checkoutSession; $this->httpContext = $httpContext; $this->storeManager = $storeManager; + $this->localeFormat = $localeFormat; } /** @@ -90,6 +99,10 @@ 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(); $store = $this->storeManager->getStore(); -- GitLab From 7daa8a4bb6840e453c7d3ee95802a2b9d2d86200 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Tue, 16 Jun 2015 16:49:44 +0300 Subject: [PATCH 256/396] MAGETWO-38667: [UI] Assistance with applying new style for Gift Options - part 2 --- .../cart/item/renderer/actions/edit.phtml | 2 +- .../cart/item/renderer/actions/remove.phtml | 2 +- .../view/frontend/templates/applied.phtml | 18 ----- .../view/frontend/templates/form.phtml | 78 ------------------- .../web/template/gift-message-item-level.html | 12 +-- .../frontend/web/template/gift-message.html | 8 +- .../renderer/actions/move_to_wishlist.phtml | 2 +- .../web/css/source/module/_cart.less | 6 +- .../web/css/source/_module.less | 9 ++- .../web/css/source/module/_cart.less | 3 +- .../web/css/source/_module.less | 12 ++- 11 files changed, 35 insertions(+), 117 deletions(-) delete mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml delete mode 100644 app/code/Magento/GiftMessage/view/frontend/templates/form.phtml 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 index 08c6f2ca40e..4123e6419a3 100644 --- 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 @@ -9,7 +9,7 @@ /** @var $block \Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit */ ?> <?php if ($block->isProductVisibleInSiteVisibility()): ?> - <a class="action edit" + <a class="action action-edit" href="<?php echo $block->getConfigureUrl() ?>" title="<?php echo $block->escapeHtml(__('Edit item parameters')); ?>"> <span> 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 index 70d782cd1a5..bed34897aec 100644 --- 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 @@ -10,7 +10,7 @@ ?> <a href="#" title="<?php echo $block->escapeHtml(__('Remove item')); ?>" - class="action delete" + class="action action-delete" data-post='<?php echo $block->getDeletePostJson(); ?>'> <span> <?php echo __('Remove item')?> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml deleted file mode 100644 index e4297826d6a..00000000000 --- a/app/code/Magento/GiftMessage/view/frontend/templates/applied.phtml +++ /dev/null @@ -1,18 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -// @codingStandardsIgnoreFile - -?> - -<?php /* Temp MAGETWO-36023 markup */?> -<?php /* Gift Message Applied */ ?> -<div class="gift-message-summary"> - <span><?php echo __('Message'); ?>:</span> - We think you’ll love this. Happy Birthday! -</div> -<?php /* End Gift Message Applied */ ?> -<?php /* End Temp MAGETWO-36023 markup */?> diff --git a/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml b/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml deleted file mode 100644 index c301f0f1415..00000000000 --- a/app/code/Magento/GiftMessage/view/frontend/templates/form.phtml +++ /dev/null @@ -1,78 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -// @codingStandardsIgnoreFile - -?> - -<?php /* Temp MAGETWO-36023 markup */?> -<?php /* Gift Message */ ?> -<div class="gift-message"> - <div class="gift-options-title"> - <span><?php echo __('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><?php echo __('To'); ?>:</span> - </label> - <div class="control"> - <input type="text" - id="gift-message-whole-to" - class="input-text" - name=""> - </div> - </div> - - <div class="field field-from"> - <label for="gift-message-whole-from" - class="label"> - <span><?php echo __('From'); ?>:</span> - </label> - <div class="control"> - <input type="text" - id="gift-message-whole-from" - class="input-text" - name=""> - </div> - </div> - - <div class="field text"> - <label for="gift-message-whole-message" - class="label"> - <span><?php echo __('Message'); ?>:</span> - </label> - <div class="control"> - <textarea - id="gift-message-whole-message" - class="input-text" - rows="5" - cols="10" - name=""></textarea> - </div> - </div> - </fieldset> - <div class="actions-toolbar"> - <div class="secondary"> - <button type="submit" - class="action secondary action-update" - title="<?php echo $block->escapeHtml(__('Update')); ?>"> - <span><?php echo __('Update'); ?></span> - </button> - <button class="action action-cancel" - title="<?php echo $block->escapeHtml(__('Cancel')); ?>"> - <span><?php echo __('Cancel'); ?></span> - </button> - </div> - </div> - </div> -</div> -<?php /* End Gift Message */ ?> -<?php /* End Temp MAGETWO-36023 markup */?> 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 index bccd7976fd2..abd28539edd 100644 --- 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 @@ -7,11 +7,11 @@ <!-- 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> + 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() --> @@ -30,7 +30,7 @@ <!-- ko if: getObservable('message') --> <div class="gift-message-summary"> - <span style="font-weight: bolder" data-bind="text: $t('Message') + ':'"></span> + <span data-bind="text: $t('Message') + ':'"></span> <!-- ko text: getObservable('message') --><!-- /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 index cfab2bf3974..9f2613cd411 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -8,11 +8,11 @@ <div class="cart-gift-item"> <div class="gift-item-block block" data-collapsible="true" - data-bind="css: {_active: formBlockVisibility() || resultBlockVisibility()}"> + 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 data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> + <div class="content" data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> <!-- ko ifnot: resultBlockVisibility() --> <div class="gift-options"> <!-- ko foreach: getRegion('additionalOptions') --> @@ -29,7 +29,7 @@ <!-- ko if: getObservable('message') --> <div class="gift-message-summary"> - <span style="font-weight: bolder" data-bind="text: $t('Message') + ':'"></span> + <span data-bind="text: $t('Message') + ':'"></span> <!-- ko text: getObservable('message') --><!-- /ko --> </div> <!-- /ko --> @@ -51,4 +51,4 @@ </div> </div> </div> -<!-- /ko --> \ No newline at end of file +<!-- /ko --> 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 index 43ab9870788..196122cf80c 100644 --- 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 @@ -11,7 +11,7 @@ <?php if ($block->isAllowInCart() && $block->isProductVisibleInSiteVisibility()): ?> <a href="#" data-post='<?php echo $block->getMoveFromCartParams(); ?>' - class="use-ajax action towishlist"> + class="use-ajax action action-towishlist"> <span><?php echo __('Move to Wishlist'); ?></span> </a> <?php endif ?> 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 f8aca74c98f..089a66bff44 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 @@ -238,9 +238,9 @@ &:extend(button all); .link-as-button(); margin-bottom: @indent__s; - margin-left: @indent__s; - &:first-child { - margin-left: 0; + margin-right: @indent__s; + &:last-child { + margin-right: 0; } } } 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 9d62f715822..1690fb1f771 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 @@ -74,6 +74,7 @@ } .action-gift { + &:extend(.cart.table-wrapper .actions-toolbar > .action all); .button-icon( @icon-down, @_icon-font-size: 32px, @@ -129,6 +130,11 @@ padding: @indent__s @indent__s @indent__base; position: relative; } + &.active { + .content { + display: block; + } + } } // @@ -225,9 +231,6 @@ .media-width(@extremum, @break) when (@extremum = 'max') and (@break = @screen__s) { .cart.table-wrapper { - .action-gift { - width: 100%; - } .gift-content { border-bottom: @border-width__base solid @border-color__base; margin-bottom: @indent__base; 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 147f5ab045f..a71b8e040cb 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 @@ -309,7 +309,7 @@ > .action-edit, > .action-delete { position: absolute; - right: 10px; + right: 16px; top: 0; .icon-font( @icon-edit, @@ -360,6 +360,7 @@ content: ':'; } } + // Product options .item-options { margin-bottom: 0; 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 533af8ef698..70b2e5cc6ab 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 @@ -26,7 +26,6 @@ & when (@media-common = true) { .gift-message { - margin-bottom: @indent__m; .actions-toolbar { .action-cancel { &:extend(.abs-action-button-as-link all); @@ -163,6 +162,11 @@ padding: @indent__s 0 @indent__base; position: relative; } + &.active { + .content { + display: block; + } + } } // @@ -292,11 +296,13 @@ .media-width(@extremum, @break) when (@extremum = 'min') and (@break = @screen__m) { .gift-message { .actions-toolbar { + padding: 0; .secondary { float: right; .action { float: right; margin-left: @indent__base; + margin-right: 0; } .action-cancel { display: block; @@ -360,6 +366,10 @@ .cart-gift-item { &:extend(.abs-shopping-cart-items-desktop all); margin-bottom: @indent__base; + .gift-options, + .gift-summary { + padding-bottom: @indent__base; + } } } } -- GitLab From 7d4c84c46755ba2193102b68314c4c86708baa5f Mon Sep 17 00:00:00 2001 From: Dmytro Bursak <dbursak@ebay.com> Date: Tue, 16 Jun 2015 16:55:00 +0300 Subject: [PATCH 257/396] MTA-2319: [PS] Backend module functional tests maintenance - Corrected global search set value --- .../lib/Magento/Mtf/Client/Element/GlobalsearchElement.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php index e1bcbd54580..e7dd59d27dd 100644 --- a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php +++ b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php @@ -69,10 +69,10 @@ class GlobalsearchElement extends SimpleElement if (!$this->find($this->searchInput)->isVisible()) { $this->find($this->searchIcon)->click(); } - $this->selectWindow(); +// $this->selectWindow(); $this->clear(); $this->find($this->searchInput)->setValue($value); - $this->selectWindow(); +// $this->selectWindow(); $this->waitResult(); } @@ -133,7 +133,7 @@ class GlobalsearchElement extends SimpleElement if ($browser->find($selector)->isVisible()) { return true; } else { - $browser->selectWindow(); +// $browser->selectWindow(); return null; } } -- GitLab From e5ce8b3cbf66ea3a7c27ffe3a9320b6be206d27e Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Tue, 16 Jun 2015 17:19:23 +0300 Subject: [PATCH 258/396] MAGNSWTCH-139: Added Details renderer support for Search results pages --- .../Catalog/Block/Product/AbstractProduct.php | 17 +++++++++-------- .../layout/catalogsearch_advanced_result.xml | 3 +++ .../layout/catalogsearch_result_index.xml | 3 +++ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php index 016866f4f1a..08617d3ebd8 100644 --- a/app/code/Magento/Catalog/Block/Product/AbstractProduct.php +++ b/app/code/Magento/Catalog/Block/Product/AbstractProduct.php @@ -607,11 +607,12 @@ class AbstractProduct extends \Magento\Framework\View\Element\Template */ public function getProductDetailsHtml(\Magento\Catalog\Model\Product $product) { - $renderer = $this - ->getDetailsRenderer($product->getTypeId()) - ->setProduct($product); - - return $renderer->toHtml(); + $renderer = $this->getDetailsRenderer($product->getTypeId()); + if ($renderer) { + $renderer->setProduct($product); + return $renderer->toHtml(); + } + return ''; } /** @@ -624,10 +625,10 @@ class AbstractProduct extends \Magento\Framework\View\Element\Template $type = 'default'; } $rendererList = $this->getDetailsRendererList(); - if (!$rendererList) { - throw new \RuntimeException('Details renderer list for block "' . $this->getNameInLayout() . '" is not defined'); + if ($rendererList) { + return $rendererList->getRenderer($type, 'default'); } - return $rendererList->getRenderer($type, 'default'); + return null; } /** diff --git a/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_advanced_result.xml b/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_advanced_result.xml index 4fe368190cb..5dc1857a43c 100644 --- a/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_advanced_result.xml +++ b/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_advanced_result.xml @@ -22,6 +22,9 @@ <action method="setToolbarBlockName"> <argument name="name" xsi:type="string">product_list_toolbar</argument> </action> + <block class="Magento\Framework\View\Element\RendererList" name="category.product.type.details.renderers" as="details.renderers"> + <block class="Magento\Framework\View\Element\Template" as="default"/> + </block> </block> <action method="setListOrders"/> <action method="setListModes"/> diff --git a/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_result_index.xml b/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_result_index.xml index b3c7f66aef6..34a0e54cfc9 100644 --- a/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_result_index.xml +++ b/app/code/Magento/CatalogSearch/view/frontend/layout/catalogsearch_result_index.xml @@ -23,6 +23,9 @@ <action method="setToolbarBlockName"> <argument name="name" xsi:type="string">product_list_toolbar</argument> </action> + <block class="Magento\Framework\View\Element\RendererList" name="category.product.type.details.renderers" as="details.renderers"> + <block class="Magento\Framework\View\Element\Template" as="default"/> + </block> </block> <action method="setListOrders"/> <action method="setListModes"/> -- GitLab From 134e2ef32ca6675423e754766b676857445ba8e5 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Tue, 16 Jun 2015 17:45:06 +0300 Subject: [PATCH 259/396] MAGETWO-38269: PR preparation & processing - Fix action callback --- app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js index 733fe3a46fb..e0b7525f007 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/columns/actions.js @@ -15,6 +15,7 @@ define([ defaults: { bodyTmpl: 'ui/grid/cells/actions', actions: [], + rows: [], templates: { actions: {} }, @@ -172,11 +173,11 @@ define([ var args = [action.index, action.recordId, action], callback = action.callback; - if (_.isObject(callback)) { + if (utils.isObject(callback)) { args.unshift(callback.target); callback = registry.async(callback.provider); - } else if (!_.isFunction(callback)) { + } else if (typeof callback != 'function') { callback = this.defaultCallback.bind(this); } -- GitLab From 03918df3ba5db1067617aa94e1db151739595378 Mon Sep 17 00:00:00 2001 From: Dmytro Bursak <dbursak@ebay.com> Date: Tue, 16 Jun 2015 17:45:40 +0300 Subject: [PATCH 260/396] MTA-2319: [PS] Backend module functional tests maintenance - Corrected global search set value --- .../Client/Element/GlobalsearchElement.php | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php index e7dd59d27dd..8378dd10b3a 100644 --- a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php +++ b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php @@ -63,17 +63,12 @@ class GlobalsearchElement extends SimpleElement public function setValue($value) { $this->eventManager->dispatchEvent(['set_value'], [__METHOD__, $this->getAbsoluteSelector()]); - $this->waitInitElement(); - if (!$this->find($this->searchInput)->isVisible()) { $this->find($this->searchIcon)->click(); } -// $this->selectWindow(); $this->clear(); $this->find($this->searchInput)->setValue($value); -// $this->selectWindow(); - $this->waitResult(); } @@ -90,16 +85,6 @@ class GlobalsearchElement extends SimpleElement } } - /** - * Select to last window. - * - * @return void - */ - protected function selectWindow() - { - $this->driver->selectWindow(); - } - /** * Wait init search suggest container. * @@ -130,12 +115,7 @@ class GlobalsearchElement extends SimpleElement $this->driver->waitUntil( function () use ($browser, $selector) { - if ($browser->find($selector)->isVisible()) { - return true; - } else { -// $browser->selectWindow(); - return null; - } + return $browser->find($selector)->isVisible() ? true : null; } ); } -- GitLab From a9a8a57d48b803c2db8645b0a6724143d4350087 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Tue, 16 Jun 2015 17:59:45 +0300 Subject: [PATCH 261/396] MAGETWO-38269: PR preparation & processing - Fix callback in massactions --- app/code/Magento/Ui/view/base/web/js/grid/massactions.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js index 6ea30ba002e..d90de60c5a6 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js @@ -124,11 +124,11 @@ define([ var callback = action.callback, args = [action, selections]; - if (_.isObject(callback)) { + if (utils.isObject(callback)) { args.unshift(callback.target); callback = registry.async(callback.provider); - } else if (!_.isFunction(callback)) { + } else if (typeof callback != 'function') { callback = this.defaultCallback.bind(this); } -- GitLab From 6d02b6b48b12dd74a5c8dff18b1bef4152519229 Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Tue, 16 Jun 2015 20:05:21 +0300 Subject: [PATCH 262/396] MTA-2350: Add wait to form element before filling a value --- .../Test/Fixture/ImportExport.xml | 36 +++++++++---------- .../Test/Block/Adminhtml/ReviewForm.xml | 2 +- .../Test/TestCase/CreateTaxRateEntityTest.xml | 2 -- .../Test/TestCase/UpdateTaxRateEntityTest.xml | 2 -- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml b/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml index 01f5463b5f0..ac1253f96a0 100644 --- a/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml +++ b/dev/tests/functional/tests/app/Magento/ImportExport/Test/Fixture/ImportExport.xml @@ -6,22 +6,22 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd"> - <fixture name="importExport" module="Magento_ImportExport" type="flat" entity_type="importexport_importdata" class="Magento\ImportExport\Test\Fixture\ImportExport"> - <dataset name="default"> - <field name="entity" xsi:type="string">Products</field> - <field name="behavior" xsi:type="string">CSV</field> - </dataset> - <field name="id" is_required="1"> - <default_value xsi:type="null"/> - </field> - <field name="entity" is_required=""> - <default_value xsi:type="string">Products</default_value> - </field> - <field name="behavior" is_required=""> - <default_value xsi:type="string">CSV</default_value> - </field> - <field name="data_export" is_required=""> - <default_value xsi:type="null"/> - </field> - </fixture> + <fixture name="importExport" module="Magento_ImportExport" type="flat" entity_type="importexport_importdata" class="Magento\ImportExport\Test\Fixture\ImportExport"> + <dataset name="default"> + <field name="entity" xsi:type="string">Products</field> + <field name="behavior" xsi:type="string">CSV</field> + </dataset> + <field name="id" is_required="1"> + <default_value xsi:type="null" /> + </field> + <field name="entity" is_required=""> + <default_value xsi:type="string">Products</default_value> + </field> + <field name="file_format" is_required=""> + <default_value xsi:type="string">CSV</default_value> + </field> + <field name="data_export" is_required=""> + <default_value xsi:type="null" /> + </field> + </fixture> </config> diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml index c1e452cd040..d1065de6f48 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <fields> <status_id> <input>select</input> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml index bee3fb886b6..9602d171bf5 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/CreateTaxRateEntityTest.xml @@ -14,7 +14,6 @@ <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">*</data> <data name="taxRate/data/tax_country_id" xsi:type="string">Australia</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">20</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateInGrid" /> @@ -55,7 +54,6 @@ <data name="taxRate/data/zip_to" xsi:type="string">7800935</data> <data name="taxRate/data/tax_postcode" xsi:type="string">-</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">7.75</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateForm" /> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml index 5f3a3e5fba7..4af48b0765f 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml @@ -43,7 +43,6 @@ <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">*</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">777</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateInGrid" /> @@ -71,7 +70,6 @@ <data name="taxRate/data/zip_to" xsi:type="string">7800935</data> <data name="taxRate/data/tax_postcode" xsi:type="string">-</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> - <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> <data name="taxRate/data/rate" xsi:type="string">12.99</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateForm" /> -- GitLab From 5bd472c17977a554bd22096bd680fdb8cf4d72a1 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Tue, 16 Jun 2015 13:23:44 -0500 Subject: [PATCH 263/396] MAGETWO-37981: Incorrect action name checks leads to customer info leak - undo fixed ACL resource --- app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php index b8ebd6411ed..54fcd049b38 100644 --- a/app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php +++ b/app/code/Magento/Sales/Controller/Adminhtml/Order/Create.php @@ -373,7 +373,7 @@ class Create extends \Magento\Backend\App\Action */ protected function _isAllowed() { - return $this->_authorization->isAllowed('Magento_Sales::actions'); + return $this->_authorization->isAllowed($this->_getAclResource()); } /** -- GitLab From f88c451b37d2668262a5878b28a3f66c98755427 Mon Sep 17 00:00:00 2001 From: Maksym Savich <msavich@ebay.com> Date: Tue, 16 Jun 2015 16:53:11 -0500 Subject: [PATCH 264/396] MAGETWO-38384: Remove Field expression and refactor the usage --- lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 74d74986e0e..013e4148ba4 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -2713,14 +2713,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'])) { -- GitLab From 98d99a8682362979a4771dea0a8bab07752d356a Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Tue, 16 Jun 2015 16:56:47 -0500 Subject: [PATCH 265/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - refactor trigger name logic --- .../Magento/Framework/App/Resource.php | 29 ++++-- .../Framework/DB/Adapter/AdapterInterface.php | 11 +++ .../Framework/DB/Adapter/Pdo/Mysql.php | 12 ++- .../Framework/DB/ExpressionConverter.php | 6 +- .../DB/Test/Unit/Adapter/Pdo/MysqlTest.php | 5 +- .../DB/Test/Unit/ExpressionConverterTest.php | 5 +- .../Mview/Test/Unit/View/SubscriptionTest.php | 92 +++++++------------ .../Framework/Mview/View/Subscription.php | 57 ++++-------- 8 files changed, 103 insertions(+), 114 deletions(-) diff --git a/lib/internal/Magento/Framework/App/Resource.php b/lib/internal/Magento/Framework/App/Resource.php index d76a3a68bdc..34da454e85a 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,27 @@ 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 + * @codeCoverageIgnore + */ + public function getTriggerName($tableName, $time, $event) + { + return $this->getConnectionByName(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 +209,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/DB/Adapter/AdapterInterface.php b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php index 96eb992ade3..ed43451bfa8 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php +++ b/lib/internal/Magento/Framework/DB/Adapter/AdapterInterface.php @@ -918,6 +918,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 abf64d9e806..3e4bdf4eb34 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -3131,15 +3131,19 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface } /** - * Returns a compressed version of the trigger name if it is too long + * Build a trigger name based on table name and trigger details * - * @param string $triggerName + * @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 Covered by tests on ExpressionConverter */ - public function getTriggerName($triggerName) + + public function getTriggerName($tableName, $time, $event) { - return ExpressionConverter::shortenEntityName($triggerName, Subscription::TRIGGER_NAME_QUALIFIER); + $triggerName = 'trg_' . $tableName . '_' . $time . '_' . $event; + return ExpressionConverter::shortenEntityName($triggerName, 'trg_'); } /** diff --git a/lib/internal/Magento/Framework/DB/ExpressionConverter.php b/lib/internal/Magento/Framework/DB/ExpressionConverter.php index 44bf35b61b5..05a6d345b35 100644 --- a/lib/internal/Magento/Framework/DB/ExpressionConverter.php +++ b/lib/internal/Magento/Framework/DB/ExpressionConverter.php @@ -101,7 +101,7 @@ class ExpressionConverter if (strlen($shortName) > self::MYSQL_IDENTIFIER_LEN) { $hash = md5($tableName); if (strlen($prefix . $hash) > self::MYSQL_IDENTIFIER_LEN) { - $tableName = self::_minusSuperfluous($hash, $prefix, self::MYSQL_IDENTIFIER_LEN); + $tableName = self::trimHash($hash, $prefix, self::MYSQL_IDENTIFIER_LEN); } else { $tableName = $prefix . $hash; } @@ -113,14 +113,14 @@ class ExpressionConverter } /** - * Minus superfluous characters from hash. + * Remove superfluous characters from hash. * * @param string $hash * @param string $prefix * @param int $maxCharacters * @return string */ - protected static function _minusSuperfluous($hash, $prefix, $maxCharacters) + private static function trimHash($hash, $prefix, $maxCharacters) { $diff = strlen($hash) + strlen($prefix) - $maxCharacters; $superfluous = $diff / 2; 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 60d336d544d..4d7bfa42ed2 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 @@ -557,9 +557,10 @@ class MysqlTest extends \PHPUnit_Framework_TestCase */ public function testGetIndexName($name, $fields, $indexType, $expectedName) { + $resultIndexName = $this->_mockAdapter->getIndexName($name, $fields, $indexType); $this->assertTrue( - strpos($this->_mockAdapter->getIndexName($name, $fields, $indexType), $expectedName) === 0, - 'Index name did not start with expected prefix' + strpos($resultIndexName, $expectedName) === 0, + "Index name '$resultIndexName' did not begin with expected value '$expectedName'" ); } diff --git a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php index 0f24beb9c35..b8a15b303f5 100644 --- a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php +++ b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php @@ -16,9 +16,10 @@ class ExpressionConverterTest extends \PHPUnit_Framework_TestCase */ public function testShortenEntityName($in, $prefix, $expectedOut) { + $resultEntityName = ExpressionConverter::shortenEntityName($in, $prefix); $this->assertTrue( - strpos(ExpressionConverter::shortenEntityName($in, $prefix), $expectedOut) === 0, - 'Entity name did not start with expected prefix' + strpos($resultEntityName, $expectedOut) === 0, + "Entity name '$resultEntityName' did not begin with expected value '$expectedOut'" ); } 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 1f7a3507c28..f9b64213642 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,13 +91,14 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase public function testCreate() { - $this->mockGetTableName(); - $shortTriggerName = 'short_trigger_name'; - $this->connectionMock->expects($this->atLeastOnce())->method('getTriggerName')->willReturn($shortTriggerName); - $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($shortTriggerName) + ->with($triggerName) ->will($this->returnSelf()); $triggerMock->expects($this->exactly(3)) ->method('getName') @@ -113,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') @@ -155,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)); @@ -184,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') @@ -202,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') @@ -230,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)); @@ -261,25 +258,4 @@ class SubscriptionTest extends \PHPUnit_Framework_TestCase $this->model->remove(); } - - /** - * @param $connection - */ - protected function mockGetConnection($connection) - { - $this->resourceMock->expects($this->atLeastOnce()) - ->method('getConnection') - ->will($this->returnValue($connection)); - } - - protected function mockGetTableName() - { - $this->resourceMock->expects($this->any()) - ->method('getTableName') - ->will($this->returnArgument(0)); - } - - public function testGetTriggerName() - { - } } diff --git a/lib/internal/Magento/Framework/Mview/View/Subscription.php b/lib/internal/Magento/Framework/Mview/View/Subscription.php index 9ff3ae97d65..e22e5efda45 100644 --- a/lib/internal/Magento/Framework/Mview/View/Subscription.php +++ b/lib/internal/Magento/Framework/Mview/View/Subscription.php @@ -14,11 +14,6 @@ use Magento\Framework\DB\ExpressionConverter; class Subscription implements SubscriptionInterface { - /** - * Trigger name qualifier - */ - const TRIGGER_NAME_QUALIFIER = 'trg_'; - /** * Database write connection * @@ -96,18 +91,10 @@ class Subscription implements SubscriptionInterface public function create() { foreach (Trigger::getListOfEvents() as $event) { - $triggerName = $this->getTriggerName( - $this->resource->getTableName($this->getTableName()), - Trigger::TIME_AFTER, - $event - ); - /** Shorten if trigger name is too long - max is 64 characters */ - $shortenedTriggerName = $this->resource->getConnection(Resource::DEFAULT_READ_RESOURCE) - ->getTriggerName($triggerName, self::TRIGGER_NAME_QUALIFIER); - + $triggerName = $this->getAfterEventTriggerName($event); /** @var Trigger $trigger */ $trigger = $this->triggerFactory->create() - ->setName($shortenedTriggerName) + ->setName($triggerName) ->setTime(Trigger::TIME_AFTER) ->setEvent($event) ->setTable($this->resource->getTableName($this->tableName)); @@ -135,22 +122,13 @@ class Subscription implements SubscriptionInterface public function remove() { foreach (Trigger::getListOfEvents() as $event) { - $triggerName = $this->getTriggerName( - $this->resource->getTableName($this->getTableName()), - Trigger::TIME_AFTER, - $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()) - ); + $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) { @@ -230,25 +208,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() { @@ -259,6 +238,7 @@ class Subscription implements SubscriptionInterface * Retrieve table name * * @return string + * @codeCoverageIgnore */ public function getTableName() { @@ -269,6 +249,7 @@ class Subscription implements SubscriptionInterface * Retrieve table column name * * @return string + * @codeCoverageIgnore */ public function getColumnName() { -- GitLab From 5987443e76459328e9b824cc6a77dde5b368d705 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Tue, 16 Jun 2015 21:32:11 -0500 Subject: [PATCH 266/396] MAGETWO-38065: /magento_verion exposes too detailed version information --- .../Version/Controller/Index/Index.php | 7 ++-- .../Version/Controller/Index/IndexTest.php | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php diff --git a/app/code/Magento/Version/Controller/Index/Index.php b/app/code/Magento/Version/Controller/Index/Index.php index 687e3d3d516..610d98e5889 100644 --- a/app/code/Magento/Version/Controller/Index/Index.php +++ b/app/code/Magento/Version/Controller/Index/Index.php @@ -31,15 +31,18 @@ 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() { + $fullVersion = explode('.', $this->productMetadata->getVersion()); + $majorMinorVersion = $fullVersion[0] . '.' . $fullVersion[1]; $this->getResponse()->setBody( $this->productMetadata->getName() . '/' . - $this->productMetadata->getVersion() . ' (' . + $majorMinorVersion . ' (' . $this->productMetadata->getEdition() . ')' ); } 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 00000000000..0046bf49a99 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php @@ -0,0 +1,33 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +class IndexTest extends \Magento\TestFramework\TestCase\AbstractController +{ + public function testExecute() + { + // Execute controller to get version response + $this->dispatch('magento_version'); + $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); + } +} -- GitLab From bc95ef18016dcfee4eff997647fbaf9d09dea762 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Tue, 16 Jun 2015 22:23:38 -0500 Subject: [PATCH 267/396] MAGETWO-38065: /magento_verion exposes too detailed version information - add namespace to test --- .../testsuite/Magento/Version/Controller/Index/IndexTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php b/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php index 0046bf49a99..c04fc7910ad 100644 --- a/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php @@ -3,6 +3,7 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ +namespace Magento\Version\Controller\Index; class IndexTest extends \Magento\TestFramework\TestCase\AbstractController { -- GitLab From 9ac1b60af8fadae88a839a9b7093891eff42be4f Mon Sep 17 00:00:00 2001 From: Sam Tay <sam.tay@blueacorn.com> Date: Tue, 16 Jun 2015 22:26:48 -0700 Subject: [PATCH 268/396] fix incorrect js filename --- .../Magento/Customer/view/frontend/web/js/customer-data.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Customer/view/frontend/web/js/customer-data.js b/app/code/Magento/Customer/view/frontend/web/js/customer-data.js index e459e07201f..2f5c1181ea1 100644 --- a/app/code/Magento/Customer/view/frontend/web/js/customer-data.js +++ b/app/code/Magento/Customer/view/frontend/web/js/customer-data.js @@ -8,7 +8,8 @@ define([ 'ko', 'Magento_Customer/js/section-config', 'jquery/jquery-storageapi', - 'jquery/jquery-cookie' + 'jquery/jquery.cookie' + ], function ($, _, ko, sectionConfig) { 'use strict'; -- GitLab From 53e5c6b2868b39eb930f3182459a02209ec4a966 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Wed, 17 Jun 2015 00:47:51 -0500 Subject: [PATCH 269/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - delete a space character --- .../Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php index b8a15b303f5..a184d739591 100644 --- a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php +++ b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php @@ -51,7 +51,7 @@ class ExpressionConverterTest extends \PHPUnit_Framework_TestCase /** Length of 64 characters, to go over max MySql identifier length */ $length64 = '________________________________________________________________'; $longPrefix = 'pre_____________________________________'; - $shortenedName = ExpressionConverter::shortenEntityName($length64 . '_cannotBeAbbreviated', $longPrefix ); + $shortenedName = ExpressionConverter::shortenEntityName($length64 . '_cannotBeAbbreviated', $longPrefix); $this->assertNotSame(0, strpos($shortenedName, 'pre'), 'Entity name not supposed to with long prefix'); } } -- GitLab From 032164a199d307212dbd4a79458674861eab14b6 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Wed, 17 Jun 2015 09:53:55 +0300 Subject: [PATCH 270/396] MAGETWO-38667: [UI] Assistance with applying new style for Gift Options - part 2 --- .../cart/item/renderer/actions/gift_options.phtml | 3 ++- .../frontend/web/template/gift-message-item-level.html | 1 - .../luma/Magento_Checkout/web/css/source/module/_cart.less | 1 + .../luma/Magento_Wishlist/web/css/source/_module.less | 7 +++++++ 4 files changed, 10 insertions(+), 2 deletions(-) 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 index 18086f43ed9..10388eabe38 100644 --- 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 @@ -10,7 +10,8 @@ ?> <?php if (!$block->isVirtual()): ?> <div id="gift-options-cart-item-<?php echo $block->getItem()->getId() ?>" - data-bind="scope:'giftOptionsCartItem-<?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"> { 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 index 3a34a932156..9dbad09a345 100644 --- 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 @@ -49,7 +49,6 @@ </button> </div> </div> - <!-- /ko --> </div> <!-- /ko --> </div> 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 a71b8e040cb..84fe60c7262 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 @@ -304,6 +304,7 @@ .actions-toolbar { &:extend(.abs-add-clearfix all); + min-height: 20px; padding-bottom: 15px; position: relative; > .action-edit, 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 c1388fd10a0..cd7be417989 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 @@ -238,6 +238,13 @@ @_icon-font-color-active: @minicart-icons-color ); } + .gift-options-cart-item { + & + .action-towishlist { + left: @indent__xl; + position: absolute; + top: 0; + } + } } } -- GitLab From 68b4802274561b5a0c8ae32bbe65e7a2b99288c7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Komar <aliaksandr_komar@epam.com> Date: Wed, 17 Jun 2015 09:55:42 +0300 Subject: [PATCH 271/396] MAGNIMEX-145: table prefixes usage --- .../CatalogImportExport/Model/Import/Product.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/CatalogImportExport/Model/Import/Product.php b/app/code/Magento/CatalogImportExport/Model/Import/Product.php index a1c98222956..ca248b50e39 100755 --- a/app/code/Magento/CatalogImportExport/Model/Import/Product.php +++ b/app/code/Magento/CatalogImportExport/Model/Import/Product.php @@ -1223,13 +1223,25 @@ class Product extends \Magento\ImportExport\Model\Import\Entity\AbstractEntity */ protected function _prepareAllMediaFiles() { + static $productEntityTableName = null; + static $productMediaGalleryTableName = null; + static $resource = null; + if (!$resource) { + $resource = $this->_resourceFactory->create(); + } + if (!$productEntityTableName) { + $productEntityTableName = $resource->getTable('catalog_product_entity'); + } + if (!$productMediaGalleryTableName) { + $productMediaGalleryTableName = $resource->getTable('catalog_product_entity_media_gallery'); + } if(empty($this->cachedImages)) { $allMedia = $this->_connection->fetchAll($this->_connection->select() ->from( - ["entity" => $this->_connection->getTableName('catalog_product_entity')], + ["entity" => $productEntityTableName], ['sku'] )->joinLeft( - ["media_gallery" => $this->_connection->getTableName('catalog_product_entity_media_gallery')], + ["media_gallery" => $productMediaGalleryTableName], "entity.entity_id = media_gallery.entity_id", ['value'] ) -- GitLab From 336ab80f52e34a2d43a6a263f1837ce576037750 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 17 Jun 2015 10:58:32 +0300 Subject: [PATCH 272/396] MAGETWO-37630: Payment information is displayed broken on "Order Management" Backend page forms - fixed tests --- .../User/Test/Constraint/AssertUserRoleRestrictedAccess.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserRoleRestrictedAccess.php b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserRoleRestrictedAccess.php index aae982aac8a..3cc80886774 100644 --- a/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserRoleRestrictedAccess.php +++ b/dev/tests/functional/tests/app/Magento/User/Test/Constraint/AssertUserRoleRestrictedAccess.php @@ -16,7 +16,7 @@ use Magento\User\Test\Fixture\User; */ class AssertUserRoleRestrictedAccess extends AbstractConstraint { - const DENIED_ACCESS = 'You need more permissions to access this.'; + const DENIED_ACCESS = 'Access denied'; /** * Asserts that user has only related permissions. -- GitLab From 75c068bc66179948ee2997bf2e5344123ac4fea3 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 11:08:06 +0300 Subject: [PATCH 273/396] MAGETWO-38154: Create block for item level --- .../layout/checkout_cart_item_renderers.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 index 48fcabf626a..de9477e6b73 100644 --- 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 @@ -97,5 +97,23 @@ </arguments> </block> </referenceBlock> + <referenceBlock name="checkout.cart.item.renderers.giftcard.actions"> + <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.giftcard.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> -- GitLab From 8d05baed05f149d36ec58080cf61bdaee1b80a9d Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 11:32:14 +0300 Subject: [PATCH 274/396] MAGETWO-38154: Create block for item level --- .../Magento/GiftMessage/Model/GiftMessageConfigProvider.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index 1ce0d84859a..3158cf45e51 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -13,7 +13,9 @@ use Magento\Framework\UrlInterface; use Magento\Framework\Locale\FormatInterface as LocaleFormat; /** - * 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.CyclomaticComplexity) */ class GiftMessageConfigProvider implements ConfigProviderInterface { -- GitLab From 2977aa36b093b4ea140f4b9b8431fbfdfbf199b9 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 11:58:17 +0300 Subject: [PATCH 275/396] MAGETWO-38154: Create block for item level --- .../Magento/GiftMessage/Model/GiftMessageConfigProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index 3158cf45e51..eb4c83db358 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -15,7 +15,7 @@ use Magento\Framework\Locale\FormatInterface as LocaleFormat; /** * Configuration provider for GiftMessage rendering on "Checkout cart" page. * @SuppressWarnings(PHPMD.CouplingBetweenObjects) - * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ class GiftMessageConfigProvider implements ConfigProviderInterface { -- GitLab From 2991f130b8f6e91337d23979265b5d1aac75611e Mon Sep 17 00:00:00 2001 From: Serhiy Shkolyarenko <sshkolyarenko@ebay.com> Date: Wed, 17 Jun 2015 13:44:18 +0300 Subject: [PATCH 276/396] MAGETWO-38824: email cannot be retrieved from address on one page checkout fix --- app/code/Magento/Quote/Model/BillingAddressManagement.php | 2 ++ app/code/Magento/Quote/Model/ShippingAddressManagement.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/code/Magento/Quote/Model/BillingAddressManagement.php b/app/code/Magento/Quote/Model/BillingAddressManagement.php index cad5a3b9c42..193232fdb25 100644 --- a/app/code/Magento/Quote/Model/BillingAddressManagement.php +++ b/app/code/Magento/Quote/Model/BillingAddressManagement.php @@ -87,6 +87,8 @@ class BillingAddressManagement implements BillingAddressManagementInterface $shippingAddress = $quote->getShippingAddress()->importCustomerAddressData($addressData); $shippingAddress->setSaveInAddressBook($saveInAddressBook); } + } elseif ($quote->getCustomerId()) { + $address->setEmail($quote->getCustomerEmail()); } $address->setSaveInAddressBook($saveInAddressBook); $quote->setBillingAddress($address); diff --git a/app/code/Magento/Quote/Model/ShippingAddressManagement.php b/app/code/Magento/Quote/Model/ShippingAddressManagement.php index d6ed6847931..07f4f61eb19 100644 --- a/app/code/Magento/Quote/Model/ShippingAddressManagement.php +++ b/app/code/Magento/Quote/Model/ShippingAddressManagement.php @@ -89,6 +89,8 @@ class ShippingAddressManagement implements ShippingAddressManagementInterface if ($customerAddressId) { $addressData = $this->addressRepository->getById($customerAddressId); $address = $quote->getShippingAddress()->importCustomerAddressData($addressData); + } elseif ($quote->getCustomerId()) { + $address->setEmail($quote->getCustomerEmail()); } $address->setSameAsBilling($sameAsBilling); $address->setSaveInAddressBook($saveInAddressBook); -- GitLab From cb824048dd32ed7f67b7c555d10173e3c5c2ee22 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Wed, 17 Jun 2015 13:45:02 +0300 Subject: [PATCH 277/396] MAGETWO-38667: [UI] Assistance with applying new style for Gift Options - part 2 --- .../web/template/gift-message-item-level.html | 4 ++-- .../view/frontend/web/template/gift-message.html | 2 +- .../Magento_GiftMessage/web/css/source/_module.less | 8 ++++---- .../Magento_GiftMessage/web/css/source/_module.less | 12 ++++++------ .../Magento_Wishlist/web/css/source/_module.less | 7 ------- 5 files changed, 13 insertions(+), 20 deletions(-) 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 index 9dbad09a345..78f2175867b 100644 --- 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 @@ -9,11 +9,11 @@ class="action action-gift" data-bind=" click: $data.toggleFormBlockVisibility.bind($data), - css: {active: formBlockVisibility() || resultBlockVisibility()} + 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 --> +<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') --> 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 index 9f2613cd411..dbe0ee8c877 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -8,7 +8,7 @@ <div class="cart-gift-item"> <div class="gift-item-block block" data-collapsible="true" - data-bind="css: {active: formBlockVisibility() || resultBlockVisibility()}"> + 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> 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 1690fb1f771..81688c7737a 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 @@ -68,7 +68,7 @@ padding: @indent__base 0; width: 100%; text-align: left; - &.active { + &._active { display: block; } } @@ -81,7 +81,7 @@ @_icon-font-line-height: 16px, @_icon-font-position: after ); - &.active { + &._active { .icon-font-symbol( @icon-up, @_icon-font-position: after @@ -96,7 +96,7 @@ .gift-item-block { margin: 0; - &.active { + &._active { .title { .icon-font-symbol( @icon-up, @@ -130,7 +130,7 @@ padding: @indent__s @indent__s @indent__base; position: relative; } - &.active { + &._active { .content { display: block; } 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 70b2e5cc6ab..225b28b4fa3 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 @@ -42,7 +42,7 @@ .cart.table-wrapper { .item-gift { - &.active { + &._active { .css(border-top, @gift-item-block__border-width solid @gift-item-block__border-color); } .action { @@ -117,7 +117,7 @@ margin-right: -100%; padding: @indent__base 0; width: 100%; - &.active { + &._active { display: block; } } @@ -130,7 +130,7 @@ .gift-item-block { .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); margin: 0; - &.active { + &._active { .title { &:after { .css(content, @gift-item-block-title-icon__active__content); @@ -162,7 +162,7 @@ padding: @indent__s 0 @indent__base; position: relative; } - &.active { + &._active { .content { display: block; } @@ -268,7 +268,7 @@ @_icon-font-color-active: @minicart-icons-color, @_icon-font-position: after ); - &.active { + &._active { border: @border-width__base solid @color-gray-light5; border-bottom-color: @color-white; margin: -@indent__xs 14px -1px -15px; @@ -354,7 +354,7 @@ @_icon-font-margin: 0 0 0 @indent__s, @_icon-font-position: after ); - &.active { + &._active { &:after { content: @icon-up; } 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 cd7be417989..c1388fd10a0 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 @@ -238,13 +238,6 @@ @_icon-font-color-active: @minicart-icons-color ); } - .gift-options-cart-item { - & + .action-towishlist { - left: @indent__xl; - position: absolute; - top: 0; - } - } } } -- GitLab From e9bcbb8bf803ea57103b63a6c05aae0ff5f3ef3a Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 15:18:40 +0300 Subject: [PATCH 278/396] MAGETWO-38155: Create block for order level --- .../Magento/Ui/Test/Unit/Component/Control/ActionPoolTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 eaae007216a..8d62c797c2f 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], -- GitLab From 33d05d2cc9e7f7b3ea5703fd424ea4ac354dee46 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 15:46:24 +0300 Subject: [PATCH 279/396] MAGETWO-38155: Create block for order level --- .../Di/Code/Scanner/ServiceDataAttributesScannerTest.php | 5 ----- 1 file changed, 5 deletions(-) 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 b7697813590..e0550e1f370 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)); } } -- GitLab From 535da621960e18c77078b4346d6d0c6768352dd7 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 16:05:40 +0300 Subject: [PATCH 280/396] MAGETWO-38154: Create block for item level --- .../layout/checkout_cart_item_renderers.xml | 18 ------------------ 1 file changed, 18 deletions(-) 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 index de9477e6b73..48fcabf626a 100644 --- 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 @@ -97,23 +97,5 @@ </arguments> </block> </referenceBlock> - <referenceBlock name="checkout.cart.item.renderers.giftcard.actions"> - <block class="Magento\GiftMessage\Block\Cart\Item\Renderer\Actions\GiftOptions" name="checkout.cart.item.renderers.giftcard.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> -- GitLab From 0d704b9a0a8dd251be39459521e388b1244f0317 Mon Sep 17 00:00:00 2001 From: Dmytro Bursak <dbursak@ebay.com> Date: Wed, 17 Jun 2015 16:45:17 +0300 Subject: [PATCH 281/396] MTA-2319: [PS] Backend module functional tests maintenance - Moved test to CE --- .../Test/TestCase/GlobalSearchEntityTest.php | 65 +++++++++++++++++++ .../Test/TestCase/GlobalSearchEntityTest.xml | 31 +++++++++ 2 files changed, 96 insertions(+) create mode 100644 dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.php create mode 100644 dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.xml diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.php b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.php new file mode 100644 index 00000000000..9624a9398b6 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.php @@ -0,0 +1,65 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Backend\Test\TestCase; + +use Magento\Backend\Test\Fixture\GlobalSearch; +use Magento\Backend\Test\Page\Adminhtml\Dashboard; +use Magento\Mtf\TestCase\Injectable; + +/** + * Preconditions: + * 1. Create customer + * 2. Create two simple products + * 3. Create order with one of created simple product + * + * Steps: + * 1. Login to backend + * 2. Click on Search button on the top of page + * 3. Fill in data according dataSet + * 4. Perform assertions + * + * @group Search_Core_(MX) + * @ZephyrId MAGETWO-28457 + */ +class GlobalSearchEntityTest extends Injectable +{ + /* tags */ + const MVP = 'no'; + const DOMAIN = 'MX'; + /* end tags */ + + /** + * Backend Dashboard page. + * + * @var Dashboard + */ + protected $dashboard; + + /** + * Preparing pages for test. + * + * @param Dashboard $dashboard + * @return void + */ + public function __inject(Dashboard $dashboard) + { + $this->dashboard = $dashboard; + } + + /** + * Run Global Search Entity Test. + * + * @param GlobalSearch $search + * @return void + */ + public function test(GlobalSearch $search) + { + //Steps: + $this->dashboard->open(); + $this->dashboard->getAdminPanelHeader()->search($search->getQuery()); + } +} diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.xml b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.xml new file mode 100644 index 00000000000..7adcf2b0241 --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/TestCase/GlobalSearchEntityTest.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> + <testCase name="Magento\Backend\Test\TestCase\GlobalSearchEntityTest"> + <variation name="GlobalSearchEntityTestVariation2"> + <data name="description" xsi:type="string">search with 2 sign return no results</data> + <data name="search/data/query" xsi:type="string">:)</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchNoRecordsFound" /> + </variation> + <variation name="GlobalSearchEntityTestVariation3"> + <data name="description" xsi:type="string">search product by sku</data> + <data name="search/data/query" xsi:type="string">orderInjectable::default::product::sku</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchProductName" /> + </variation> + <variation name="GlobalSearchEntityTestVariation4"> + <data name="description" xsi:type="string">search existed customer</data> + <data name="search/data/query" xsi:type="string">customer::johndoe_unique::lastname</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchCustomerName" /> + </variation> + <variation name="GlobalSearchEntityTestVariation5"> + <data name="description" xsi:type="string">search order (by order id)</data> + <data name="search/data/query" xsi:type="string">orderInjectable::default::id</data> + <constraint name="Magento\Backend\Test\Constraint\AssertGlobalSearchOrderId" /> + </variation> + </testCase> +</config> -- GitLab From 519d326a039c777cf84a020bba920d58c3456bd0 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 17:59:56 +0300 Subject: [PATCH 282/396] MAGETWO-38155: Create block for order level --- .../layout/checkout_cart_item_renderers.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 index 48fcabf626a..b94cab5dace 100644 --- 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 @@ -97,5 +97,23 @@ </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> -- GitLab From f831931213b8e55d275c17a76a21a4a53a671eeb Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Wed, 17 Jun 2015 10:14:54 -0500 Subject: [PATCH 283/396] MAGETWO-16192: Security: Clickjacking solution - introduce X-Frame-Options - use plugin to send xFrameOptions header when response is sent - get inject header value into plugin via DI argument injection - setup a config field in env.php to contain non-backend header values --- .htaccess | 9 +--- app/code/Magento/Backend/etc/adminhtml/di.xml | 5 +++ app/code/Magento/Store/etc/di.xml | 4 ++ app/etc/di.xml | 5 +++ .../Magento/Framework/App/Response/Http.php | 20 +++++++++ .../App/Response/XFrameOptPlugin.php | 43 +++++++++++++++++++ .../Config/ConfigOptionsListConstants.php | 3 +- .../Magento/Setup/Model/ConfigGenerator.php | 14 ++++++ .../Magento/Setup/Model/ConfigOptionsList.php | 1 + .../Test/Unit/Model/ConfigGeneratorTest.php | 41 ++++++++++++++++++ 10 files changed, 136 insertions(+), 9 deletions(-) create mode 100644 lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php create mode 100644 setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php diff --git a/.htaccess b/.htaccess index 01f8f8dd24d..9f630df0ae6 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/Backend/etc/adminhtml/di.xml b/app/code/Magento/Backend/etc/adminhtml/di.xml index 553d30e8554..cccd487a9f5 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/Store/etc/di.xml b/app/code/Magento/Store/etc/di.xml index 320253c316b..a1f8ad99744 100644 --- a/app/code/Magento/Store/etc/di.xml +++ b/app/code/Magento/Store/etc/di.xml @@ -296,4 +296,8 @@ </argument> </arguments> </type> + <type name="Magento\Framework\App\Response\Http"> + <plugin name="xFrameOptionsHeader" type="Magento\Framework\App\Response\XFrameOptPlugin"/> + </type> + </config> diff --git a/app/etc/di.xml b/app/etc/di.xml index bf956a4b271..0fb3f6ad44f 100644 --- a/app/etc/di.xml +++ b/app/etc/di.xml @@ -134,6 +134,11 @@ <preference for="Magento\Framework\Api\ImageContentValidatorInterface" type="Magento\Framework\Api\ImageContentValidator" /> <preference for="Magento\Framework\Api\ImageProcessorInterface" type="Magento\Framework\Api\ImageProcessor" /> <preference for="Magento\Framework\Code\Reader\ClassReaderInterface" type="Magento\Framework\Code\Reader\ClassReader" /> + <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\Model\Resource\Db\TransactionManager" shared="false" /> <type name="Magento\Framework\Logger\Handler\Base"> <arguments> diff --git a/lib/internal/Magento/Framework/App/Response/Http.php b/lib/internal/Magento/Framework/App/Response/Http.php index 55cda163252..864a203cf98 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,18 @@ 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 + * @codeCoverageIgnore + */ + public function setXFrameOptions($value) + { + $this->setHeader(self::HEADER_X_FRAME_OPT, $value); + } + /** * Send Vary cookie * @@ -109,6 +124,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response * Set headers for no-cache responses * * @return void + * @codeCoverageIgnore */ public function setNoCacheHeaders() { @@ -122,6 +138,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 +148,7 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response /** * @return string[] + * @codeCoverageIgnore */ public function __sleep() { @@ -141,6 +159,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 +173,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 00000000000..d3441ccc271 --- /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. + * @codeCoverageIgnore + */ +class XFrameOptPlugin +{ + /** Deployment config key for frontend x-frame-options header value */ + const DEPLOYMENT_CONFIG_X_FRAME_OPT = 'x-frame-options'; + + /** Always send DENY in backend x-frame-options header */ + const BACKEND_X_FRAME_OPT = 'DENY'; + + /** + *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 + */ + public function beforeSendResponse(\Magento\Framework\App\Response\Http $subject) + { + $subject->setXFrameOptions($this->xFrameOpt); + } +} diff --git a/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php b/lib/internal/Magento/Framework/Config/ConfigOptionsListConstants.php index f6de3f89043..3148109e539 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/setup/src/Magento/Setup/Model/ConfigGenerator.php b/setup/src/Magento/Setup/Model/ConfigGenerator.php index a1a07d52e20..42701b7da25 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, 'DENY'); + } + return $configData; + } } diff --git a/setup/src/Magento/Setup/Model/ConfigOptionsList.php b/setup/src/Magento/Setup/Model/ConfigOptionsList.php index 64f2a58515e..ee76fbf6d4e 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 00000000000..00a02f83b5f --- /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('DENY', $configData->getData()[ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT]); + } +} -- GitLab From 03e2c462e70e10400ac784446064565b5cf4b1c0 Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Wed, 17 Jun 2015 18:24:17 +0300 Subject: [PATCH 284/396] MAGETWO-38780: It's unable to edit the Order from Admin panel --- .../view/adminhtml/web/order/edit/message.js | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/app/code/Magento/Sales/view/adminhtml/web/order/edit/message.js b/app/code/Magento/Sales/view/adminhtml/web/order/edit/message.js index 5479b721272..13511e83106 100644 --- a/app/code/Magento/Sales/view/adminhtml/web/order/edit/message.js +++ b/app/code/Magento/Sales/view/adminhtml/web/order/edit/message.js @@ -7,7 +7,7 @@ define([ "jquery", "jquery/ui", - 'Magento_Ui/js/dialog/dialog', + 'Magento_Ui/js/modal/modal', "mage/translate" ], function($){ "use strict"; @@ -15,7 +15,7 @@ define([ options: { url: null, message: null, - dialog: null + modal: null }, /** @@ -26,10 +26,10 @@ define([ }, /** - * Show dialog + * Show modal */ showDialog: function() { - this.options.dialog.html(this.options.message).trigger('openDialog'); + this.options.dialog.html(this.options.message).modal('openModal'); }, /** @@ -40,11 +40,24 @@ define([ }, /** - * Prepare dialog + * Prepare modal * @protected */ _prepareDialog: function() { - this.options.dialog = $('<div class="ui-dialog-content ui-widget-content"></div>').dialog(); + var self = this; + + this.options.dialog = $('<div class="ui-dialog-content ui-widget-content"></div>').modal({ + type: 'popup', + modalClass: 'edit-order-popup', + title: $.mage.__('Edit Order'), + buttons: [{ + text: $.mage.__('Ok'), + 'class': 'action-primary', + click: function(){ + self.redirect(); + } + }] + }); } }); -- GitLab From b806482edd7795f33194d96b85f1661d6c8fde28 Mon Sep 17 00:00:00 2001 From: Dmytro Bursak <dbursak@ebay.com> Date: Wed, 17 Jun 2015 18:32:33 +0300 Subject: [PATCH 285/396] MTA-2319: [PS] Backend module functional tests maintenance - Corrected set value for global search element --- .../Client/Element/GlobalsearchElement.php | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php index 8378dd10b3a..50307147313 100644 --- a/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php +++ b/dev/tests/functional/lib/Magento/Mtf/Client/Element/GlobalsearchElement.php @@ -14,11 +14,6 @@ use Magento\Mtf\Client\ElementInterface; */ class GlobalsearchElement extends SimpleElement { - /** - * "Backspace" key code. - */ - const BACKSPACE = "\xEE\x80\x83"; - /** * Search icon selector. * @@ -67,24 +62,10 @@ class GlobalsearchElement extends SimpleElement if (!$this->find($this->searchInput)->isVisible()) { $this->find($this->searchIcon)->click(); } - $this->clear(); - $this->find($this->searchInput)->setValue($value); + $this->find($this->searchInput)->keys(str_split($value)); $this->waitResult(); } - /** - * Clear value of element. - * - * @return void - */ - protected function clear() - { - $element = $this->find($this->searchInput); - while ('' != $element->getValue()) { - $element->setValue([self::BACKSPACE]); - } - } - /** * Wait init search suggest container. * -- GitLab From fd7c475a9fb7a3aa21248c1b959373f4f563201a Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 17 Jun 2015 18:34:31 +0300 Subject: [PATCH 286/396] MAGETWO-38155: Create block for order level --- app/code/Magento/Checkout/composer.json | 1 - app/code/Magento/Downloadable/composer.json | 1 - 2 files changed, 2 deletions(-) diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json index db8918bca76..089f1374669 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-beta13", "magento/module-eav": "0.74.0-beta13", "magento/module-gift-message": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", "magento/module-page-cache": "0.74.0-beta13", "magento/module-theme": "0.74.0-beta13", "magento/module-msrp": "0.74.0-beta13", diff --git a/app/code/Magento/Downloadable/composer.json b/app/code/Magento/Downloadable/composer.json index 15f14f91214..465c23eb678 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-beta13", "magento/module-checkout": "0.74.0-beta13", "magento/module-directory": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", "magento/module-gift-message": "0.74.0-beta13", "magento/module-catalog-inventory": "0.74.0-beta13", "magento/module-msrp": "0.74.0-beta13", -- GitLab From 525937e92a2701ca920efc60bcda1c1a8301df02 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Wed, 17 Jun 2015 18:49:57 +0300 Subject: [PATCH 287/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - fixes after CR --- .../Reports/view/adminhtml/layout/reports_report_grid.xml | 4 ++-- .../Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php | 2 +- app/code/Magento/Sales/Block/Adminhtml/Order/Invoice/View.php | 2 +- .../Shipping/Controller/Adminhtml/Order/Shipment/AddTrack.php | 2 +- .../Controller/Adminhtml/Order/Shipment/RemoveTrack.php | 4 ++-- .../Controller/Adminhtml/Order/Shipment/RemoveTrackTest.php | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) 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 ec35449c548..54e6a1f160b 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 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> + <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/Sales/Block/Adminhtml/Order/Creditmemo/View.php b/app/code/Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php index 39ed7ecbf7b..57c74c61cb1 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Creditmemo/View.php @@ -132,7 +132,7 @@ class View extends \Magento\Backend\Block\Widget\Form\Container if ($this->getCreditmemo()->getEmailSent()) { $emailSent = __('The credit memo email was sent.'); } else { - $emailSent = __('The credit memo email was 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 45e1eeb888f..c3f359585a8 100644 --- a/app/code/Magento/Sales/Block/Adminhtml/Order/Invoice/View.php +++ b/app/code/Magento/Sales/Block/Adminhtml/Order/Invoice/View.php @@ -191,7 +191,7 @@ class View extends \Magento\Backend\Block\Widget\Form\Container if ($this->getInvoice()->getEmailSent()) { $emailSent = __('The invoice email was sent.'); } else { - $emailSent = __('The invoice email was not sent.'); + $emailSent = __('The invoice email wasn\'t sent.'); } return __( 'Invoice #%1 | %2 | %4 (%3)', 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 af29bd59f8a..ea5ab1d9677 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 c603c2a9436..4b85739acc0 100644 --- a/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php +++ b/app/code/Magento/Shipping/Controller/Adminhtml/Order/Shipment/RemoveTrack.php @@ -61,11 +61,11 @@ 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 = [ 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 9b6169a7744..bb0b1d21202 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 @@ -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()) -- GitLab From 5f2dfdfd161e33db085dd19b963caf756ea500c2 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Wed, 17 Jun 2015 11:13:33 -0500 Subject: [PATCH 288/396] MAGETWO-38065: /magento_verion exposes too detailed version information --- .../testsuite/Magento/Version/Controller/Index/IndexTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php b/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php index c04fc7910ad..3fcd5237249 100644 --- a/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Version/Controller/Index/IndexTest.php @@ -7,10 +7,10 @@ namespace Magento\Version\Controller\Index; class IndexTest extends \Magento\TestFramework\TestCase\AbstractController { - public function testExecute() + public function testIndexAction() { // Execute controller to get version response - $this->dispatch('magento_version'); + $this->dispatch('magento_version/index/index'); $body = $this->getResponse()->getBody(); $objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager(); -- GitLab From f0da50c4d1d381752d487b42ef950d7ec65f7a57 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Wed, 17 Jun 2015 11:22:09 -0500 Subject: [PATCH 289/396] MAGETWO-16192: Security: Clickjacking solution - introduce X-Frame-Options - update unit tests --- .../Setup/Test/Unit/Module/ConfigOptionsListTest.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup/src/Magento/Setup/Test/Unit/Module/ConfigOptionsListTest.php b/setup/src/Magento/Setup/Test/Unit/Module/ConfigOptionsListTest.php index f972d2e802b..d1281f7c30c 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)); } } -- GitLab From 02715c40b3eca6cd4ba16f29580d05965e50bfce Mon Sep 17 00:00:00 2001 From: Oleksandr Miroshnichenko <omiroshnichenko@ebay.com> Date: Wed, 17 Jun 2015 19:30:34 +0300 Subject: [PATCH 290/396] MAGETWO-38255: Stabilize story after QA --- .../Ui/base/js/grid/columns/actions.test.js | 100 ++++++++++++++++++ .../dialog.test.js => modal/modal.test.js} | 12 +-- 2 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/columns/actions.test.js rename dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/{dialog/dialog.test.js => modal/modal.test.js} (60%) diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/columns/actions.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/columns/actions.test.js new file mode 100644 index 00000000000..331dbef78d0 --- /dev/null +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/columns/actions.test.js @@ -0,0 +1,100 @@ +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +define([ + 'underscore', + 'Magento_Ui/js/grid/columns/actions' +], function (_, Actions) { + 'use strict'; + + describe('ui/js/grid/columns/actions', function () { + var model, + action; + + beforeEach(function () { + model = new Actions({ + index: 'actions', + name: 'listing_action', + indexField: 'id', + dataScope: '', + rows: [{ + identifier: 'row' + }] + }); + action = { + index: 'delete', + hidden: true, + rowIndex: 0, + callback: function() { + return true; + } + }; + }); + + it('Check addAction function', function () { + expect(model.addAction('delete', action)).toBe(model); + }); + + it('Check getAction function', function () { + var someAction = _.clone(action); + + someAction.index = 'edit'; + model.addAction('edit', someAction); + expect(model.getAction(0, 'edit')).toEqual(someAction); + }); + + it('Check getVisibleActions function', function () { + var someAction = _.clone(action); + + someAction.hidden = false; + someAction.index= 'view'; + model.addAction('delete', action); + model.addAction('view', someAction); + expect(model.getVisibleActions('0')).toEqual([someAction]); + }); + + it('Check updateActions function', function () { + expect(model.updateActions()).toEqual(model); + }); + + it('Check applyAction function', function () { + model.addAction('delete', action); + expect(model.applyAction('delete', 0)).toEqual(model); + }); + + it('Check isSingle and isMultiple function', function () { + var someAction = _.clone(action); + + action.hidden = false; + model.addAction('delete', action); + expect(model.isSingle(0)).toBeTruthy(); + someAction.hidden = false; + someAction.index = 'edit'; + model.addAction('edit', someAction); + expect(model.isSingle(0)).toBeFalsy(); + expect(model.isMultiple(0)).toBeTruthy(); + }); + + it('Check isActionVisible function', function () { + expect(model.isActionVisible(action)).toBeFalsy(); + action.hidden = false; + expect(model.isActionVisible(action)).toBeTruthy(); + }); + + it('Check toggleList function', function () { + model.toggleList(0); + expect(model.opened()).toEqual(0); + model.toggleList(0); + expect(model.opened()).toBeFalsy(); + }); + + it('Check closeList function', function () { + model.toggleList(0); + expect(model.opened()).toEqual(0); + model.closeList(0); + expect(model.opened()).toBeFalsy(); + }); + }); +}); \ No newline at end of file diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/dialog/dialog.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/modal/modal.test.js similarity index 60% rename from dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/dialog/dialog.test.js rename to dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/modal/modal.test.js index be1e6dfa867..b5e2837467b 100644 --- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/dialog/dialog.test.js +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/modal/modal.test.js @@ -5,23 +5,23 @@ define([ 'jquery', - 'Magento_Ui/js/dialog/dialog' + 'Magento_Ui/js/modal/modal' ], function ($) { 'use strict'; - describe('ui/js/dialog/dialog', function () { + describe('ui/js/modal/modal', function () { var element = $('<div>some element</div>'), - dialog = element.dialog({}).data('mage-dialog'); + modal = element.modal({}).data('mage-modal'); - it('Check for dialog definition', function () { - expect(dialog).toBeDefined(); + it('Check for modal definition', function () { + expect(modal).toBeDefined(); }); it('Show/hide function check', function () { expect(element.trigger('openDialog')).toBe(element); expect(element.trigger('closeDialog')).toBe(element); }); it('Check for transition support', function () { - expect(dialog.whichTransitionEvent()).toBe('webkitTransitionEnd'); + expect(modal.whichTransitionEvent()).toBe('webkitTransitionEnd'); }); }); }); \ No newline at end of file -- GitLab From 736707181657a35c591e453da9f0424b2dd9f6d1 Mon Sep 17 00:00:00 2001 From: Fred Sung <csung@ebay.com> Date: Tue, 16 Jun 2015 16:30:06 -0500 Subject: [PATCH 291/396] MAGETWO-38833: Fix error message format inconsistency in theme uninstall command - Format the error messages. --- .../Console/Command/ThemeUninstallCommand.php | 41 +++++------ .../Magento/Theme/Model/ThemeValidator.php | 10 +-- .../Command/ThemeUninstallCommandTest.php | 73 ++++++++++++------- .../Test/Unit/Model/ThemeValidatorTest.php | 6 +- 4 files changed, 74 insertions(+), 56 deletions(-) diff --git a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php index 2f62bc394b3..871c5d5650d 100644 --- a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php +++ b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php @@ -194,25 +194,24 @@ class ThemeUninstallCommand extends Command */ protected function execute(InputInterface $input, OutputInterface $output) { + $messages = []; $themePaths = $input->getArgument(self::INPUT_KEY_THEMES); - $validationMessages = $this->validate($themePaths); - if (!empty($validationMessages)) { - $output->writeln($validationMessages); - return; - } - $isThemeInUseMessages = $this->themeValidator->validateIsThemeInUse($themePaths); - if (!empty($isThemeInUseMessages)) { - $output->writeln($isThemeInUseMessages); - return; - } - $childThemeCheckMessages = $this->checkChildTheme($themePaths); - if (!empty($childThemeCheckMessages)) { - $output->writeln($childThemeCheckMessages); + $messages = array_merge($messages, $this->validate($themePaths)); + if (!empty($messages)) { + $output->writeln($messages); return; } - $dependencyMessages = $this->checkDependencies($themePaths); - if (!empty($dependencyMessages)) { - $output->writeln($dependencyMessages); + $messages = array_merge( + $messages, + $this->themeValidator->validateIsThemeInUse($themePaths), + $this->checkChildTheme($themePaths), + $this->checkDependencies($themePaths) + ); + if (!empty($messages)) { + $output->writeln( + '<error>Unable to uninstall. Please fix the following issues:</error>' + . PHP_EOL . implode(PHP_EOL, $messages) + ); return; } @@ -290,8 +289,8 @@ class ThemeUninstallCommand extends Command foreach ($dependencies as $package => $dependingPackages) { if (!empty($dependingPackages)) { $messages[] = - '<error>Cannot uninstall ' . $packageToPath[$package] . - " because the following package(s) depend on it:</error>" . + '<error>' . $packageToPath[$package] . + " has the following package(s) depend on it:</error>" . PHP_EOL . "\t<error>" . implode('</error>' . PHP_EOL . "\t<error>", $dependingPackages) . "</error>"; } @@ -322,13 +321,11 @@ class ThemeUninstallCommand extends Command } if (!empty($themeHasVirtualChildren)) { $text = count($themeHasVirtualChildren) > 1 ? ' are parents of' : ' is a parent of'; - $messages[] = '<error>Unable to uninstall. ' - . implode(', ', $themeHasVirtualChildren) . $text . ' virtual theme</error>'; + $messages[] = '<error>' . implode(', ', $themeHasVirtualChildren) . $text . ' virtual theme</error>'; } if (!empty($themeHasPhysicalChildren)) { $text = count($themeHasPhysicalChildren) > 1 ? ' are parents of' : ' is a parent of'; - $messages[] = '<error>Unable to uninstall. ' - . implode(', ', $themeHasPhysicalChildren) . $text . ' physical theme</error>'; + $messages[] = '<error>' . implode(', ', $themeHasPhysicalChildren) . $text . ' physical theme</error>'; } return $messages; } diff --git a/app/code/Magento/Theme/Model/ThemeValidator.php b/app/code/Magento/Theme/Model/ThemeValidator.php index 6f8b0ddda26..3923eeb644d 100644 --- a/app/code/Magento/Theme/Model/ThemeValidator.php +++ b/app/code/Magento/Theme/Model/ThemeValidator.php @@ -75,15 +75,15 @@ class ThemeValidator foreach ($configData as $row) { switch($row['scope']) { case 'default': - $messages[] = $themesById[$row['value']] . ' is in use in default config'; + $messages[] = '<error>' . $themesById[$row['value']] . ' is in use in default config' . '</error>'; break; case ScopeInterface::SCOPE_WEBSITES: - $messages[] = $themesById[$row['value']] . ' is in use in website ' - . $this->storeManager->getWebsite($row['scope_id'])->getName(); + $messages[] = '<error>' . $themesById[$row['value']] . ' is in use in website ' + . $this->storeManager->getWebsite($row['scope_id'])->getName() . '</error>'; break; case ScopeInterface::SCOPE_STORES: - $messages[] = $themesById[$row['value']] . ' is in use in store ' - . $this->storeManager->getStore($row['scope_id'])->getName(); + $messages[] = '<error>' . $themesById[$row['value']] . ' is in use in store ' + . $this->storeManager->getStore($row['scope_id'])->getName() . '</error>'; break; } } diff --git a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php index c8c8f92a1b6..37c9f8c2257 100644 --- a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php +++ b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php @@ -250,6 +250,31 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase $this->collection->expects($this->any())->method('getIterator')->willReturn(new \ArrayIterator([])); } + public function setupPassThemeInUseCheck() + { + $this->themeValidator->expects($this->once())->method('validateIsThemeInUse')->willReturn([]); + } + + public function setupPassDependencyCheck() + { + $this->dependencyChecker->expects($this->once())->method('checkDependencies')->willReturn([]); + } + + public function testExecuteFailedThemeInUseCheck() + { + $this->setUpPassValidation(); + $this->setupPassChildThemeCheck(); + $this->setupPassDependencyCheck(); + $this->themeValidator + ->expects($this->once()) + ->method('validateIsThemeInUse') + ->willReturn(['frontend/Magento/a is in use in default config']); + $this->tester->execute(['theme' => ['frontend/Magento/a']]); + $this->assertEquals( + 'Unable to uninstall. Please fix the following issues:' . PHP_EOL + . 'frontend/Magento/a is in use in default config' . PHP_EOL, $this->tester->getDisplay()); + } + /** * @dataProvider executeFailedChildThemeCheckDataProvider * @param bool $hasVirtual @@ -261,6 +286,8 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase public function testExecuteFailedChildThemeCheck($hasVirtual, $hasPhysical, array $input, $expected) { $this->setUpPassValidation(); + $this->setupPassThemeInUseCheck(); + $this->setupPassDependencyCheck(); $theme = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); $theme->expects($this->any())->method('hasChildThemes')->willReturn($hasVirtual); $parentThemeA = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); @@ -282,10 +309,7 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase ->method('getIterator') ->willReturn(new \ArrayIterator([$childThemeC, $childThemeD])); $this->tester->execute($input); - $this->assertContains( - $expected, - $this->tester->getDisplay() - ); + $this->assertContains($expected, $this->tester->getDisplay()); } /** @@ -298,65 +322,61 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase true, false, ['theme' => ['frontend/Magento/a']], - 'Unable to uninstall. frontend/Magento/a is a parent of virtual theme' + 'Unable to uninstall. Please fix the following issues:' . PHP_EOL + . 'frontend/Magento/a is a parent of virtual theme' ], [ true, false, ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], - 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of virtual theme' + 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . + 'frontend/Magento/a, frontend/Magento/b are parents of virtual theme' ], [ false, true, ['theme' => ['frontend/Magento/a']], - 'Unable to uninstall. frontend/Magento/a is a parent of physical theme' + 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . + 'frontend/Magento/a is a parent of physical theme' ], [ false, true, ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], - 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of physical theme' + 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . + 'frontend/Magento/a, frontend/Magento/b are parents of physical theme' ], [ true, true, ['theme' => ['frontend/Magento/a']], - 'Unable to uninstall. frontend/Magento/a is a parent of virtual theme' . PHP_EOL . - 'Unable to uninstall. frontend/Magento/a is a parent of physical theme' + 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . + 'frontend/Magento/a is a parent of virtual theme' . PHP_EOL . + 'frontend/Magento/a is a parent of physical theme' ], [ true, true, ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], - 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of virtual theme' . PHP_EOL . - 'Unable to uninstall. frontend/Magento/a, frontend/Magento/b are parents of physical theme' + 'frontend/Magento/a, frontend/Magento/b are parents of virtual theme' . PHP_EOL . + 'frontend/Magento/a, frontend/Magento/b are parents of physical theme' ], ]; } - public function testExecuteFailedThemeInUseCheck() - { - $this->setUpPassValidation(); - $this->themeValidator - ->expects($this->once()) - ->method('validateIsThemeInUse') - ->willReturn(['frontend/Magento/a is in use in default config']); - $this->tester->execute(['theme' => ['frontend/Magento/a']]); - $this->assertEquals('frontend/Magento/a is in use in default config' . PHP_EOL, $this->tester->getDisplay()); - } - public function testExecuteFailedDependencyCheck() { $this->setUpPassValidation(); + $this->setupPassThemeInUseCheck(); $this->setupPassChildThemeCheck(); $this->dependencyChecker->expects($this->once()) ->method('checkDependencies') ->willReturn(['magento/theme-a' => ['magento/theme-b', 'magento/theme-c']]); $this->tester->execute(['theme' => ['frontend/Magento/a']]); $this->assertContains( - 'Cannot uninstall frontend/Magento/a because the following package(s) ' . - 'depend on it:' . PHP_EOL . "\tmagento/theme-b" . PHP_EOL . "\tmagento/theme-c", + 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . + 'frontend/Magento/a has the following package(s) depend on it:' + . PHP_EOL . "\tmagento/theme-b" . PHP_EOL . "\tmagento/theme-c", $this->tester->getDisplay() ); } @@ -364,8 +384,9 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase public function setUpExecute() { $this->setUpPassValidation(); + $this->setupPassThemeInUseCheck(); $this->setupPassChildThemeCheck(); - $this->dependencyChecker->expects($this->once())->method('checkDependencies')->willReturn([]); + $this->setupPassDependencyCheck(); $this->remove->expects($this->once())->method('remove'); $this->cache->expects($this->once())->method('clean'); $theme = $this->getMock('Magento\Theme\Model\Theme', [], [], '', false); diff --git a/app/code/Magento/Theme/Test/Unit/Model/ThemeValidatorTest.php b/app/code/Magento/Theme/Test/Unit/Model/ThemeValidatorTest.php index d6fc5f272f5..f4b7d2a5d4f 100644 --- a/app/code/Magento/Theme/Test/Unit/Model/ThemeValidatorTest.php +++ b/app/code/Magento/Theme/Test/Unit/Model/ThemeValidatorTest.php @@ -81,9 +81,9 @@ class ThemeValidatorTest extends \PHPUnit_Framework_TestCase $result = $this->themeValidator->validateIsThemeInUse(['frontend/Magento/a']); $this->assertEquals( [ - 'frontend/Magento/a is in use in default config', - 'frontend/Magento/a is in use in website websiteA', - 'frontend/Magento/a is in use in store storeA' + '<error>frontend/Magento/a is in use in default config</error>', + '<error>frontend/Magento/a is in use in website websiteA</error>', + '<error>frontend/Magento/a is in use in store storeA</error>' ], $result ); -- GitLab From 36ef30c22f9babb1961738ae2323f846bcee63d5 Mon Sep 17 00:00:00 2001 From: Fred Sung <csung@ebay.com> Date: Tue, 16 Jun 2015 17:05:54 -0500 Subject: [PATCH 292/396] MAGETWO-38833: Fix error message format inconsistency in theme uninstall command - Code style issue fixed. --- .../Test/Unit/Console/Command/ThemeUninstallCommandTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php index 37c9f8c2257..87f93bb408e 100644 --- a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php +++ b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php @@ -272,7 +272,9 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase $this->tester->execute(['theme' => ['frontend/Magento/a']]); $this->assertEquals( 'Unable to uninstall. Please fix the following issues:' . PHP_EOL - . 'frontend/Magento/a is in use in default config' . PHP_EOL, $this->tester->getDisplay()); + . 'frontend/Magento/a is in use in default config' . PHP_EOL, + $this->tester->getDisplay() + ); } /** -- GitLab From eff83374902c7382dc2e69a698094e6d45404e8a Mon Sep 17 00:00:00 2001 From: Fred Sung <csung@ebay.com> Date: Wed, 17 Jun 2015 17:29:46 -0500 Subject: [PATCH 293/396] MAGETWO-38833: Fix error message format inconsistency in theme uninstall command - Updated composer.lock --- composer.lock | 558 +++++++++++++++++++++----------------------------- 1 file changed, 230 insertions(+), 328 deletions(-) diff --git a/composer.lock b/composer.lock index 2436cff71f1..beefd078b4a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "55186e4b1650ca5f2ad865799800f636", + "hash": "a62e70bed8efa22bebb0fedf63b51925", "packages": [ { "name": "composer/composer", @@ -49,7 +49,7 @@ "Composer": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -76,20 +76,20 @@ }, { "name": "justinrainbow/json-schema", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3" + "reference": "7dfe4f1db8a62be3dd35710efce663537d515653" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2465fe486c864e30badaa4d005ebdf89dbc503f3", - "reference": "2465fe486c864e30badaa4d005ebdf89dbc503f3", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/7dfe4f1db8a62be3dd35710efce663537d515653", + "reference": "7dfe4f1db8a62be3dd35710efce663537d515653", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=5.3.2" }, "require-dev": { "json-schema/json-schema-test-suite": "1.1.0", @@ -110,7 +110,7 @@ "JsonSchema": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -138,7 +138,7 @@ "json", "schema" ], - "time": "2015-03-27 16:41:39" + "time": "2015-06-14 20:01:28" }, { "name": "magento/magento-composer-installer", @@ -178,7 +178,7 @@ "MagentoHackathon\\Composer\\Magento": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "OSL-3.0" ], @@ -248,7 +248,7 @@ "Zend_": "library/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "library/" ], @@ -315,7 +315,7 @@ "Monolog\\": "src/Monolog" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -364,7 +364,7 @@ "lessc.inc.php" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], @@ -414,7 +414,7 @@ "Psr\\Log\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -458,7 +458,7 @@ "Seld\\JsonLint\\": "src/Seld/JsonLint/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -480,20 +480,21 @@ }, { "name": "symfony/console", - "version": "v2.7.1", + "version": "v2.6.9", + "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "564398bc1f33faf92fc2ec86859983d30eb81806" + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/564398bc1f33faf92fc2ec86859983d30eb81806", - "reference": "564398bc1f33faf92fc2ec86859983d30eb81806", + "url": "https://api.github.com/repos/symfony/Console/zipball/b5ec0c11a204718f2b656357f5505a8e578f30dd", + "reference": "b5ec0c11a204718f2b656357f5505a8e578f30dd", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.3.3" }, "require-dev": { "psr/log": "~1.0", @@ -509,15 +510,15 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.6-dev" } }, "autoload": { - "psr-4": { + "psr-0": { "Symfony\\Component\\Console\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -533,7 +534,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-06-10 15:30:22" + "time": "2015-05-29 14:42:58" }, { "name": "symfony/finder", @@ -566,7 +567,7 @@ "Symfony\\Component\\Finder\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -615,7 +616,7 @@ "Symfony\\Component\\Process\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -656,7 +657,7 @@ "cssmin.php" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -683,12 +684,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-code.git", - "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140" + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-code/zipball/0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", - "reference": "0ed94f842ba60cdc900c46a61bdbd7ac95a3e140", + "reference": "cfd5951ff4348e4430850560416c7ddb755f95d3", "shasum": "" }, "require": { @@ -697,9 +698,6 @@ }, "require-dev": { "doctrine/common": ">=2.1", - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-stdlib": "self.version" }, "suggest": { @@ -715,20 +713,20 @@ }, "autoload": { "psr-4": { - "Zend\\Code\\": "src/" + "Zend\\Code\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides facilities to generate arbitrary code using an object oriented interface", - "homepage": "https://github.com/zendframework/zend-code", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "code", "zf2" ], - "time": "2015-03-31 15:39:14" + "time": "2015-04-01 17:59:08" }, { "name": "zendframework/zend-config", @@ -736,12 +734,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-config.git", - "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d" + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-config/zipball/95f3a4b3fa85d49e6f060183122de4596fa6d29d", - "reference": "95f3a4b3fa85d49e6f060183122de4596fa6d29d", + "reference": "8682fe4e2923b383bb6472fc84b5796a07589163", "shasum": "" }, "require": { @@ -749,9 +747,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", "zendframework/zend-json": "self.version", @@ -772,20 +767,20 @@ }, "autoload": { "psr-4": { - "Zend\\Config\\": "src/" + "Zend\\Config\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a nested object property based user interface for accessing this configuration data within application code", - "homepage": "https://github.com/zendframework/zend-config", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "config", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 17:59:31" }, { "name": "zendframework/zend-console", @@ -793,23 +788,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-console.git", - "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7" + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-console/zipball/54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", - "reference": "54823d9ba6f8ce39046384ee5a043b5b3d5f56d7", + "reference": "94ab6663b07e19f20b3319ecf317bd72b6a72dca", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "suggest": { "zendframework/zend-filter": "To support DefaultRouteMatcher usage", "zendframework/zend-validator": "To support DefaultRouteMatcher usage" @@ -823,19 +813,19 @@ }, "autoload": { "psr-4": { - "Zend\\Console\\": "src/" + "Zend\\Console\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-console", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "console", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 17:59:48" }, { "name": "zendframework/zend-di", @@ -843,12 +833,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-di.git", - "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2" + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-di/zipball/b9f8de081adecf71a003a569e9ba76c0a4c00bf2", - "reference": "b9f8de081adecf71a003a569e9ba76c0a4c00bf2", + "reference": "0811f2a67ad0b50dfb8d602ed67cde0b82249190", "shasum": "" }, "require": { @@ -857,9 +847,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -874,19 +861,19 @@ }, "autoload": { "psr-4": { - "Zend\\Di\\": "src/" + "Zend\\Di\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-di", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "di", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:01:30" }, { "name": "zendframework/zend-escaper", @@ -894,22 +881,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-escaper.git", - "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97" + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/15e5769e4fcdb4bf07ebd76500810e7070e23a97", - "reference": "15e5769e4fcdb4bf07ebd76500810e7070e23a97", + "reference": "65b3328627362b0be1d5e9067bc846511d1fbc96", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -919,19 +901,19 @@ }, "autoload": { "psr-4": { - "Zend\\Escaper\\": "src/" + "Zend\\Escaper\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-escaper", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "escaper", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:02:07" }, { "name": "zendframework/zend-eventmanager", @@ -939,23 +921,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-eventmanager.git", - "reference": "58d21c95c7005a527262fd536499195f104e83f9" + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/58d21c95c7005a527262fd536499195f104e83f9", - "reference": "58d21c95c7005a527262fd536499195f104e83f9", + "reference": "38df5b567d4ff4d22144745c503ba0502d0d5695", "shasum": "" }, "require": { "php": ">=5.3.23", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -965,19 +942,19 @@ }, "autoload": { "psr-4": { - "Zend\\EventManager\\": "src/" + "Zend\\EventManager\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-event-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "eventmanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:05:26" }, { "name": "zendframework/zend-filter", @@ -985,12 +962,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-filter.git", - "reference": "6d8aed2da81b62a04747346c4370562cdbe34595" + "reference": "b13741a88553351fc52472de529b57b580b8f6f1" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-filter/zipball/6d8aed2da81b62a04747346c4370562cdbe34595", - "reference": "6d8aed2da81b62a04747346c4370562cdbe34595", + "reference": "b13741a88553351fc52472de529b57b580b8f6f1", "shasum": "" }, "require": { @@ -998,9 +975,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-crypt": "self.version", "zendframework/zend-servicemanager": "self.version", "zendframework/zend-uri": "self.version" @@ -1020,20 +994,20 @@ }, "autoload": { "psr-4": { - "Zend\\Filter\\": "src/" + "Zend\\Filter\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a set of commonly needed data filters", - "homepage": "https://github.com/zendframework/zend-filter", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "filter", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-form", @@ -1041,12 +1015,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-form.git", - "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3" + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-form/zipball/bca0db55718355d25c2c10fdd41a83561f1c94b3", - "reference": "bca0db55718355d25c2c10fdd41a83561f1c94b3", + "reference": "09f5bd46ffbf783df22281898e2175b291bd43a3", "shasum": "" }, "require": { @@ -1055,9 +1029,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-captcha": "self.version", "zendframework/zend-code": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1088,19 +1059,19 @@ }, "autoload": { "psr-4": { - "Zend\\Form\\": "src/" + "Zend\\Form\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-form", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "form", "zf2" ], - "time": "2015-03-28 20:29:18" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-http", @@ -1108,12 +1079,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-http.git", - "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb" + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-http/zipball/9c6047a0bdb3094d3ea07a215ff929cc47de4deb", - "reference": "9c6047a0bdb3094d3ea07a215ff929cc47de4deb", + "reference": "ee6220609845b32d1b2873c9ac694aef56d508f5", "shasum": "" }, "require": { @@ -1123,11 +1094,6 @@ "zendframework/zend-uri": "self.version", "zendframework/zend-validator": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1137,20 +1103,20 @@ }, "autoload": { "psr-4": { - "Zend\\Http\\": "src/" + "Zend\\Http\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", - "homepage": "https://github.com/zendframework/zend-http", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "http", "zf2" ], - "time": "2015-03-27 15:46:30" + "time": "2015-04-01 18:09:25" }, { "name": "zendframework/zend-i18n", @@ -1158,12 +1124,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-i18n.git", - "reference": "9aebc5287373a802540d75fe5508417f866c2e52" + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-i18n/zipball/9aebc5287373a802540d75fe5508417f866c2e52", - "reference": "9aebc5287373a802540d75fe5508417f866c2e52", + "reference": "33051775d9a8c341fe3b77d1f3daa0e921e2f4bd", "shasum": "" }, "require": { @@ -1171,9 +1137,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-cache": "self.version", "zendframework/zend-config": "self.version", "zendframework/zend-eventmanager": "self.version", @@ -1202,19 +1165,19 @@ }, "autoload": { "psr-4": { - "Zend\\I18n\\": "src/" + "Zend\\I18n\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-i18n", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "i18n", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-inputfilter", @@ -1222,12 +1185,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-inputfilter.git", - "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93" + "reference": "16856fec61f285e41e5492235220a4dec06ab90f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-inputfilter/zipball/4b1398f3635fae3cc5e873c5bb067274f3d10a93", - "reference": "4b1398f3635fae3cc5e873c5bb067274f3d10a93", + "reference": "16856fec61f285e41e5492235220a4dec06ab90f", "shasum": "" }, "require": { @@ -1237,9 +1200,6 @@ "zendframework/zend-validator": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1254,19 +1214,19 @@ }, "autoload": { "psr-4": { - "Zend\\InputFilter\\": "src/" + "Zend\\InputFilter\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-input-filter", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "inputfilter", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-json", @@ -1274,12 +1234,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-json.git", - "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f" + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-json/zipball/2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", - "reference": "2d845e151c1b9a237cf1899ac31e17fb10bd1e3f", + "reference": "76aeb27e4baf39799e5ca3cf6f2fdd6748ee930c", "shasum": "" }, "require": { @@ -1287,9 +1247,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version", "zendframework/zend-server": "self.version" }, @@ -1307,20 +1264,20 @@ }, "autoload": { "psr-4": { - "Zend\\Json\\": "src/" + "Zend\\Json\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", - "homepage": "https://github.com/zendframework/zend-json", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "json", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-loader", @@ -1328,22 +1285,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-loader.git", - "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4" + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-loader/zipball/65de2c7a56f8eee633c6bf1cfab73e45648880d4", - "reference": "65de2c7a56f8eee633c6bf1cfab73e45648880d4", + "reference": "6868b8a0c346f17fb97724c3a63aa2cbf6b94865", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1353,19 +1305,19 @@ }, "autoload": { "psr-4": { - "Zend\\Loader\\": "src/" + "Zend\\Loader\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-loader", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "loader", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-log", @@ -1373,12 +1325,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-log.git", - "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd" + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-log/zipball/002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", - "reference": "002e3c810cad7e31e51c9895e9e3cb6fbd312cdd", + "reference": "2d5d20fd45470506bdaff727c46dc25fe953146e", "shasum": "" }, "require": { @@ -1387,9 +1339,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-console": "self.version", "zendframework/zend-db": "self.version", "zendframework/zend-escaper": "self.version", @@ -1413,21 +1362,21 @@ }, "autoload": { "psr-4": { - "Zend\\Log\\": "src/" + "Zend\\Log\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "component for general purpose logging", - "homepage": "https://github.com/zendframework/zend-log", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "log", "logging", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:26" }, { "name": "zendframework/zend-math", @@ -1435,22 +1384,17 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-math.git", - "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73" + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-math/zipball/f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", - "reference": "f41fe4acfd809c14f2a802d1aa45dec8fcd2cc73", + "reference": "634123f83ca90b6613f132d0d100e6b5e9890a29", "shasum": "" }, "require": { "php": ">=5.3.23" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "suggest": { "ext-bcmath": "If using the bcmath functionality", "ext-gmp": "If using the gmp functionality", @@ -1466,19 +1410,19 @@ }, "autoload": { "psr-4": { - "Zend\\Math\\": "src/" + "Zend\\Math\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-math", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "math", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-modulemanager", @@ -1486,12 +1430,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-modulemanager.git", - "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f" + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-modulemanager/zipball/af7ae3cd29a1efb73cc66ae1081e606039d5c20f", - "reference": "af7ae3cd29a1efb73cc66ae1081e606039d5c20f", + "reference": "cbe16b0eafe734a062ed0182381e64b9c953dccf", "shasum": "" }, "require": { @@ -1500,9 +1444,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-config": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-loader": "self.version", @@ -1524,19 +1465,19 @@ }, "autoload": { "psr-4": { - "Zend\\ModuleManager\\": "src/" + "Zend\\ModuleManager\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-module-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "modulemanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-mvc", @@ -1544,12 +1485,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-mvc.git", - "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431" + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-mvc/zipball/0b4a4a829b30be510a3f215c4ff00c703ee8b431", - "reference": "0b4a4a829b30be510a3f215c4ff00c703ee8b431", + "reference": "bfff0f5f9e4d925ee13b8c159c9d6ae7e0db5412", "shasum": "" }, "require": { @@ -1560,9 +1501,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-console": "self.version", "zendframework/zend-di": "self.version", @@ -1611,19 +1549,19 @@ }, "autoload": { "psr-4": { - "Zend\\Mvc\\": "src/" + "Zend\\Mvc\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-mvc", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "mvc", "zf2" ], - "time": "2015-03-26 18:55:14" + "time": "2015-04-01 18:09:27" }, { "name": "zendframework/zend-serializer", @@ -1631,12 +1569,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-serializer.git", - "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09" + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-serializer/zipball/3c531789a9882a5deb721356a7bd2642b65d4b09", - "reference": "3c531789a9882a5deb721356a7bd2642b65d4b09", + "reference": "a46960854d6326f0036d98c9abc7a79e36e25928", "shasum": "" }, "require": { @@ -1646,9 +1584,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-servicemanager": "self.version" }, "suggest": { @@ -1663,20 +1598,20 @@ }, "autoload": { "psr-4": { - "Zend\\Serializer\\": "src/" + "Zend\\Serializer\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides an adapter based interface to simply generate storable representation of PHP types by different facilities, and recover", - "homepage": "https://github.com/zendframework/zend-serializer", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "serializer", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-server", @@ -1684,12 +1619,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-server.git", - "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49" + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-server/zipball/d11ff0bd529d202022823d4accf5983cbd50fc49", - "reference": "d11ff0bd529d202022823d4accf5983cbd50fc49", + "reference": "fc73c34490908ba143af3c57c7e166b40c4b9f8e", "shasum": "" }, "require": { @@ -1697,11 +1632,6 @@ "zendframework/zend-code": "self.version", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1711,19 +1641,19 @@ }, "autoload": { "psr-4": { - "Zend\\Server\\": "src/" + "Zend\\Server\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-server", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "server", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-servicemanager", @@ -1731,21 +1661,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-servicemanager.git", - "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083" + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-servicemanager/zipball/57cf99fa5ac08c05a135a8d0d676c52a5e450083", - "reference": "57cf99fa5ac08c05a135a8d0d676c52a5e450083", + "reference": "d3c27c708a148a30608f313a5b7a61a531bd9cb9", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-di": "self.version" }, "suggest": { @@ -1761,19 +1688,19 @@ }, "autoload": { "psr-4": { - "Zend\\ServiceManager\\": "src/" + "Zend\\ServiceManager\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-service-manager", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "servicemanager", "zf2" ], - "time": "2015-03-23 18:29:14" + "time": "2015-04-01 18:09:28" }, { "name": "zendframework/zend-soap", @@ -1781,12 +1708,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-soap.git", - "reference": "a599463aba97ce247faf3fb443e3c7858b46449b" + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-soap/zipball/a599463aba97ce247faf3fb443e3c7858b46449b", - "reference": "a599463aba97ce247faf3fb443e3c7858b46449b", + "reference": "e42b900798ea95a9063fa4922da976d8b3a8ab6f", "shasum": "" }, "require": { @@ -1796,9 +1723,6 @@ "zendframework/zend-uri": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-http": "self.version" }, "suggest": { @@ -1813,19 +1737,19 @@ }, "autoload": { "psr-4": { - "Zend\\Soap\\": "src/" + "Zend\\Soap\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-soap", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "soap", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-stdlib", @@ -1833,21 +1757,18 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-stdlib.git", - "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3" + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/cf05c5ba75606e47ffee91cedc72778da46f74c3", - "reference": "cf05c5ba75606e47ffee91cedc72778da46f74c3", + "reference": "eab586f4c18af3fa63c977611939f1f4a3cf1030", "shasum": "" }, "require": { "php": ">=5.3.23" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-eventmanager": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-serializer": "self.version", @@ -1868,19 +1789,19 @@ }, "autoload": { "psr-4": { - "Zend\\Stdlib\\": "src/" + "Zend\\Stdlib\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-stdlib", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "stdlib", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-text", @@ -1888,12 +1809,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-text.git", - "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7" + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-text/zipball/d962ea25647b20527f3ca34ae225bbc885dabfc7", - "reference": "d962ea25647b20527f3ca34ae225bbc885dabfc7", + "reference": "35f519e20e575a331c2ee554e5a555a59ce4b9e2", "shasum": "" }, "require": { @@ -1901,11 +1822,6 @@ "zendframework/zend-servicemanager": "self.version", "zendframework/zend-stdlib": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1915,19 +1831,19 @@ }, "autoload": { "psr-4": { - "Zend\\Text\\": "src/" + "Zend\\Text\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], - "homepage": "https://github.com/zendframework/zend-text", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "text", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-uri", @@ -1935,12 +1851,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-uri.git", - "reference": "bd9e625639415376f6a82551c73328448d7bc7d1" + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-uri/zipball/bd9e625639415376f6a82551c73328448d7bc7d1", - "reference": "bd9e625639415376f6a82551c73328448d7bc7d1", + "reference": "53f5b162b293f80de8b951eece8e08be83c4fe16", "shasum": "" }, "require": { @@ -1948,11 +1864,6 @@ "zendframework/zend-escaper": "self.version", "zendframework/zend-validator": "self.version" }, - "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master" - }, "type": "library", "extra": { "branch-alias": { @@ -1962,20 +1873,20 @@ }, "autoload": { "psr-4": { - "Zend\\Uri\\": "src/" + "Zend\\Uri\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "a component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", - "homepage": "https://github.com/zendframework/zend-uri", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "uri", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:29" }, { "name": "zendframework/zend-validator", @@ -1983,12 +1894,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-validator.git", - "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f" + "reference": "eb678d20256f120a72ca27276bbb2875841701ab" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-validator/zipball/45fac2545a0f2eb66d71cb7966feee481e7c475f", - "reference": "45fac2545a0f2eb66d71cb7966feee481e7c475f", + "reference": "eb678d20256f120a72ca27276bbb2875841701ab", "shasum": "" }, "require": { @@ -1996,9 +1907,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-db": "self.version", "zendframework/zend-filter": "self.version", "zendframework/zend-i18n": "self.version", @@ -2026,20 +1934,20 @@ }, "autoload": { "psr-4": { - "Zend\\Validator\\": "src/" + "Zend\\Validator\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a set of commonly needed validators", - "homepage": "https://github.com/zendframework/zend-validator", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "validator", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:30" }, { "name": "zendframework/zend-view", @@ -2047,12 +1955,12 @@ "source": { "type": "git", "url": "https://github.com/zendframework/zend-view.git", - "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9" + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/zendframework/zend-view/zipball/37beb1ad46e530f627b4b6c3716efd728e976ba9", - "reference": "37beb1ad46e530f627b4b6c3716efd728e976ba9", + "reference": "e119b4b5f082af58a96eb206e782b62c193227bf", "shasum": "" }, "require": { @@ -2062,9 +1970,6 @@ "zendframework/zend-stdlib": "self.version" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", "zendframework/zend-authentication": "self.version", "zendframework/zend-escaper": "self.version", "zendframework/zend-feed": "self.version", @@ -2103,35 +2008,35 @@ }, "autoload": { "psr-4": { - "Zend\\View\\": "src/" + "Zend\\View\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], "description": "provides a system of helpers, output filters, and variable escaping", - "homepage": "https://github.com/zendframework/zend-view", + "homepage": "https://github.com/zendframework/zf2", "keywords": [ "view", "zf2" ], - "time": "2015-03-25 20:55:48" + "time": "2015-04-01 18:09:30" } ], "packages-dev": [ { "name": "doctrine/instantiator", - "version": "1.0.4", + "version": "1.0.5", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", - "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { @@ -2142,7 +2047,7 @@ "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" + "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { @@ -2151,11 +2056,11 @@ } }, "autoload": { - "psr-0": { - "Doctrine\\Instantiator\\": "src" + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2172,20 +2077,20 @@ "constructor", "instantiate" ], - "time": "2014-10-13 12:58:55" + "time": "2015-06-14 21:17:01" }, { "name": "fabpot/php-cs-fixer", - "version": "v1.8.1", + "version": "v1.9", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "c1e28e95a978e967dade5469a4bf88162faa67bf" + "reference": "ef528b9d3f1dd66197baabf8f77c8402c62bb9fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/c1e28e95a978e967dade5469a4bf88162faa67bf", - "reference": "c1e28e95a978e967dade5469a4bf88162faa67bf", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/ef528b9d3f1dd66197baabf8f77c8402c62bb9fc", + "reference": "ef528b9d3f1dd66197baabf8f77c8402c62bb9fc", "shasum": "" }, "require": { @@ -2211,7 +2116,7 @@ "Symfony\\CS\\": "Symfony/CS/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2226,7 +2131,7 @@ } ], "description": "A tool to automatically fix PHP code style", - "time": "2015-05-29 06:10:12" + "time": "2015-06-13 09:30:19" }, { "name": "league/climate", @@ -2255,7 +2160,7 @@ "League\\CLImate\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2316,7 +2221,7 @@ "OAuth\\Unit": "tests" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -2371,7 +2276,7 @@ "PDepend\\": "src/main/php/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2412,7 +2317,7 @@ "PHPMD\\": "src/main/php" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2482,7 +2387,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2525,7 +2430,7 @@ "File/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], @@ -2570,7 +2475,7 @@ "Text/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "" ], @@ -2593,16 +2498,16 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d", + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d", "shasum": "" }, "require": { @@ -2611,13 +2516,10 @@ "type": "library", "autoload": { "classmap": [ - "PHP/" + "src/" ] }, - "notification-url": "http://packagist.org/downloads/", - "include-path": [ - "" - ], + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2633,7 +2535,7 @@ "keywords": [ "timer" ], - "time": "2013-08-02 07:42:54" + "time": "2015-06-13 07:35:30" }, { "name": "phpunit/php-token-stream", @@ -2667,7 +2569,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2734,7 +2636,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "include-path": [ "", "../../symfony/yaml/" @@ -2794,7 +2696,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2846,7 +2748,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2908,7 +2810,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -2960,7 +2862,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3011,7 +2913,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3076,7 +2978,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3118,7 +3020,7 @@ "src/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3172,7 +3074,7 @@ "StaticReview\\": "src/" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3243,7 +3145,7 @@ "CodeSniffer/Standards/Zend/Sniffs/" ] }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3293,7 +3195,7 @@ "Symfony\\Component\\Config\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3353,7 +3255,7 @@ "Symfony\\Component\\DependencyInjection\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3411,7 +3313,7 @@ "Symfony\\Component\\EventDispatcher\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3460,7 +3362,7 @@ "Symfony\\Component\\Filesystem\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3509,7 +3411,7 @@ "Symfony\\Component\\Stopwatch\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -3558,7 +3460,7 @@ "Symfony\\Component\\Yaml\\": "" } }, - "notification-url": "http://packagist.org/downloads/", + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], -- GitLab From 2ae78c448511d14c464e5cc4dea144c9e666dbc8 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Wed, 17 Jun 2015 17:38:29 -0500 Subject: [PATCH 294/396] MAGETWO-38935: Add Integration Tests for changes in CE --- .../Adminhtml/Notification/MarkAsReadTest.php | 16 +++++++ .../Notification/MassMarkAsReadTest.php | 16 +++++++ .../Adminhtml/Notification/MassRemoveTest.php | 16 +++++++ .../Adminhtml/Notification/RemoveTest.php | 16 +++++++ .../Utility/BackendAclAbstractTest.php | 47 +++++++++++++++++++ .../Adminhtml/Order/AddCommentTest.php | 16 +++++++ .../Adminhtml/Order/AddressSaveTest.php | 16 +++++++ .../Adminhtml/Order/AddressTest.php | 16 +++++++ .../Controller/Adminhtml/Order/CancelTest.php | 16 +++++++ .../Controller/Adminhtml/Order/EmailTest.php | 16 +++++++ .../Controller/Adminhtml/Order/HoldTest.php | 16 +++++++ .../Adminhtml/Order/ReviewPaymentTest.php | 16 +++++++ .../Controller/Adminhtml/Order/UnholdTest.php | 16 +++++++ .../Controller/Adminhtml/Order/ViewTest.php | 16 +++++++ .../Adminhtml/Transactions/ExportPostTest.php | 16 +++++++ .../Transactions/ImportExportTest.php | 16 +++++++ .../Adminhtml/Transactions/ImportPostTest.php | 16 +++++++ .../Controller/Adminhtml/Rate/FetchTest.php | 16 +++++++ 18 files changed, 319 insertions(+) create mode 100644 dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsReadTest.php create mode 100644 dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsReadTest.php create mode 100644 dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemoveTest.php create mode 100644 dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/RemoveTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Backend/Utility/BackendAclAbstractTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddCommentTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressSaveTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CancelTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/EmailTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/HoldTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ReviewPaymentTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/UnholdTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ViewTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ExportPostTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportExportTest.php create mode 100644 dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportPostTest.php create mode 100644 dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/FetchTest.php 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 00000000000..08b6b606db5 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..a82d6589fa1 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..066adfc61d9 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..201182d55aa --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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/Utility/BackendAclAbstractTest.php b/dev/tests/integration/testsuite/Magento/Backend/Utility/BackendAclAbstractTest.php new file mode 100644 index 00000000000..8915a5faad4 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Backend/Utility/BackendAclAbstractTest.php @@ -0,0 +1,47 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\Backend\Utility; + +/** + * Contains logic for testing authorization mechanism of controllers + */ +class BackendAclAbstractTest extends \Magento\Backend\Utility\Controller +{ + /** + * The resource used to authorize action + * + * @var string + */ + protected $resource; + + /** + * The uri at which to access the controller + * + * @var string + */ + protected $uri; + + public function testAclHasAccess() + { + \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->get('Magento\Framework\Acl\Builder') + ->getAcl() + ->allow(null, $this->resource);; + $this->dispatch($this->uri); + $this->assertNotSame(403, $this->getResponse()->getHttpResponseCode()); + } + + public function testAclNoAccess() + { + \Magento\TestFramework\Helper\Bootstrap::getObjectManager() + ->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/Sales/Controller/Adminhtml/Order/AddCommentTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddCommentTest.php new file mode 100644 index 00000000000..5b68faa50f9 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..17aae2a6595 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..c34d908df0e --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..4c6af707596 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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/EmailTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/EmailTest.php new file mode 100644 index 00000000000..fe24662dc1a --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..8e8d0c0351b --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..8723d9dbde2 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..c120423b410 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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 00000000000..74869f35047 --- /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\Backend\Utility\BackendAclAbstractTest +{ + 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/Transactions/ExportPostTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ExportPostTest.php new file mode 100644 index 00000000000..54409561b72 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ExportPostTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Transactions; + +class ExportPostTest extends \Magento\Backend\Utility\BackendAclAbstractTest +{ + 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/Sales/Controller/Adminhtml/Transactions/ImportExportTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportExportTest.php new file mode 100644 index 00000000000..0dcfe24c5e1 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportExportTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Transactions; + +class ImportExportTest extends \Magento\Backend\Utility\BackendAclAbstractTest +{ + 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/Sales/Controller/Adminhtml/Transactions/ImportPostTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportPostTest.php new file mode 100644 index 00000000000..862dfabb041 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportPostTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Transactions; + +class ImportPostTest extends \Magento\Backend\Utility\BackendAclAbstractTest +{ + 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/FetchTest.php b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/FetchTest.php new file mode 100644 index 00000000000..e49d16678d5 --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/FetchTest.php @@ -0,0 +1,16 @@ +<?php +/*** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Sales\Controller\Adminhtml\Transactions; + +class FetchTest extends \Magento\Backend\Utility\BackendAclAbstractTest +{ + public function setUp() + { + $this->resource = 'Magento_Sales::transactions_fetch'; + $this->uri = 'backend/sales/transactions/fetch'; + parent::setUp(); + } +} -- GitLab From cf770038c33894958c72003febf2f158aecbcf0d Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Thu, 18 Jun 2015 09:47:47 +0300 Subject: [PATCH 295/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixed tests --- .../Customer/Test/TestStep/LoginCustomerOnFrontendStep.php | 2 +- .../Customer/Test/TestStep/LogoutCustomerOnFrontendStep.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 b3b0ff013ca..ff3cdce1e34 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("Sign 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 b0b81eb8df7..5e1cac805f9 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 @@ -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(); } -- GitLab From 841199cbd3f31eae3e9bc2b4e8f8a847cc2a7e30 Mon Sep 17 00:00:00 2001 From: Serhiy Shkolyarenko <sshkolyarenko@ebay.com> Date: Wed, 17 Jun 2015 18:43:33 +0300 Subject: [PATCH 296/396] MAGETWO-38824: email cannot be retrieved from address on one page checkout test fixes (cherry picked from commit 677b172) --- .../Magento/Quote/Api/BillingAddressManagementTest.php | 2 -- .../Magento/Quote/Api/GuestBillingAddressManagementTest.php | 1 - .../Magento/Quote/Api/GuestShippingAddressManagementTest.php | 1 - .../Magento/Quote/Api/ShippingAddressManagementTest.php | 2 -- 4 files changed, 6 deletions(-) diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php index 4cc58bed391..f664ebd2e34 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php @@ -103,7 +103,6 @@ class BillingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', - 'email' => 'cat@dog.com', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', @@ -226,7 +225,6 @@ class BillingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', - 'email' => 'cat@dog.com', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php index cbf99b7f992..70323d0848c 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php @@ -112,7 +112,6 @@ class GuestBillingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', - 'email' => 'cat@dog.com', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php index 2e01c93f13a..f252515e1aa 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php @@ -153,7 +153,6 @@ class GuestShippingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', - 'email' => 'cat@dog.com', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php index b789a1d4031..f6eedecd3b2 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php @@ -128,7 +128,6 @@ class ShippingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', - 'email' => 'cat@dog.com', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', @@ -306,7 +305,6 @@ class ShippingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', - 'email' => 'cat@dog.com', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', -- GitLab From 04b071e76e1d9343a448bda3a47571de16a16351 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Thu, 18 Jun 2015 11:08:21 +0300 Subject: [PATCH 297/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixed tests --- .../Catalog/Controller/Adminhtml/Product/Attribute/Save.php | 2 +- .../Catalog/Controller/Adminhtml/Product/Attribute/Validate.php | 2 +- .../Magento/Catalog/Api/AttributeSetManagementTest.php | 2 +- .../Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 2af5e4358e2..66ad7b8f3d1 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Save.php @@ -106,7 +106,7 @@ class Save extends \Magento\Catalog\Controller\Adminhtml\Product\Attribute ->setName($name) ->getAttributeSet(); } catch (AlreadyExistsException $alreadyExists) { - $this->messageManager->addError(__('Product Template named \'%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) { 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 c7e205df237..f4db052d14a 100644 --- a/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php +++ b/app/code/Magento/Catalog/Controller/Adminhtml/Product/Attribute/Validate.php @@ -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(__('Product Template named \'%1\' already exists.', $setName)); + $this->messageManager->addError(__('An attribute set named \'%1\' already exists.', $setName)); $layout = $this->layoutFactory->create(); $layout->initMessages(); diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php index f6bea81a529..7bf42be970e 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php @@ -156,7 +156,7 @@ class AttributeSetManagementTest extends WebapiAbstract $entityTypeCode = 'catalog_product'; $entityType = $this->getEntityTypeByCode($entityTypeCode); $attributeSetName = 'Default'; - $expectedMessage = 'Product template named "Default" already exists.'; + $expectedMessage = 'An attribute set "Default" already exists.'; $arguments = [ 'attributeSet' => [ 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 ed7b1ec0e51..3a6be9535a8 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), - 'Product Template named "' . $filterAttributeSet['set_name'] . '" is present in Product Template grid.' + 'An attribute set "' . $filterAttributeSet['set_name'] . '" is present in Product Template grid.' ); } -- GitLab From c6734a6b35f953f4de218e4a4e2e600afac7bd42 Mon Sep 17 00:00:00 2001 From: Serhiy Shkolyarenko <sshkolyarenko@ebay.com> Date: Thu, 18 Jun 2015 12:10:00 +0300 Subject: [PATCH 298/396] MAGETWO-38824: email cannot be retrieved from address on one page checkout soap tests fix --- .../Magento/Quote/Api/BillingAddressManagementTest.php | 2 ++ .../Magento/Quote/Api/GuestBillingAddressManagementTest.php | 2 ++ .../Magento/Quote/Api/GuestShippingAddressManagementTest.php | 2 ++ .../Magento/Quote/Api/ShippingAddressManagementTest.php | 2 ++ 4 files changed, 8 insertions(+) diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php index f664ebd2e34..bf42f3fba14 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/BillingAddressManagementTest.php @@ -103,6 +103,7 @@ class BillingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', + 'email' => '', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', @@ -133,6 +134,7 @@ class BillingAddressManagementTest extends WebapiAbstract $this->assertContains($streetLine, $quote->getBillingAddress()->getStreet()); } unset($addressData['street']); + unset($addressData['email']); $this->assertEquals('billing', $savedData['address_type']); //check the rest of fields foreach ($addressData as $key => $value) { diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php index 70323d0848c..554b6728a02 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestBillingAddressManagementTest.php @@ -112,6 +112,7 @@ class GuestBillingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', + 'email' => '', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', @@ -142,6 +143,7 @@ class GuestBillingAddressManagementTest extends WebapiAbstract $this->assertContains($streetLine, $quote->getBillingAddress()->getStreet()); } unset($addressData['street']); + unset($addressData['email']); $this->assertEquals('billing', $savedData['address_type']); //check the rest of fields foreach ($addressData as $key => $value) { diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php index f252515e1aa..6ac15b22292 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/GuestShippingAddressManagementTest.php @@ -153,6 +153,7 @@ class GuestShippingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', + 'email' => '', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', @@ -182,6 +183,7 @@ class GuestShippingAddressManagementTest extends WebapiAbstract //custom checks for street, region and address_type $this->assertEquals($addressData['street'], $quote->getShippingAddress()->getStreet()); unset($addressData['street']); + unset($addressData['email']); $this->assertEquals('shipping', $savedData['address_type']); //check the rest of fields diff --git a/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php index f6eedecd3b2..a15ea0d24fb 100644 --- a/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Quote/Api/ShippingAddressManagementTest.php @@ -128,6 +128,7 @@ class ShippingAddressManagementTest extends WebapiAbstract $addressData = [ 'firstname' => 'John', 'lastname' => 'Smith', + 'email' => '', 'company' => 'eBay Inc', 'street' => ['Typical Street', 'Tiny House 18'], 'city' => 'Big City', @@ -157,6 +158,7 @@ class ShippingAddressManagementTest extends WebapiAbstract //custom checks for street, region and address_type $this->assertEquals($addressData['street'], $quote->getShippingAddress()->getStreet()); unset($addressData['street']); + unset($addressData['email']); $this->assertEquals('shipping', $savedData['address_type']); //check the rest of fields -- GitLab From f65e41dfa082ddcbc5000805f09d9b0a1d37dbf7 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 18 Jun 2015 14:33:03 +0300 Subject: [PATCH 299/396] MAGETWO-38155: Create block for order level --- .../Magento/Integration/Model/CustomerTokenServiceTest.php | 1 + 1 file changed, 1 insertion(+) 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 5e31104da16..5da752794e9 100644 --- a/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php @@ -60,6 +60,7 @@ class CustomerTokenServiceTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/Customer/_files/customer.php + * @magentoAppIsolation enabled */ public function testCreateCustomerAccessToken() { -- GitLab From c47948a661d5d31ccc845c0a72557a0247b1e90c Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Thu, 18 Jun 2015 16:20:16 +0300 Subject: [PATCH 300/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixed tests --- .../Magento/Catalog/Api/AttributeSetManagementTest.php | 2 +- .../Catalog/Test/Constraint/AssertProductTemplateNotInGrid.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php index 7bf42be970e..12fceed6d9d 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/AttributeSetManagementTest.php @@ -156,7 +156,7 @@ class AttributeSetManagementTest extends WebapiAbstract $entityTypeCode = 'catalog_product'; $entityType = $this->getEntityTypeByCode($entityTypeCode); $attributeSetName = 'Default'; - $expectedMessage = 'An attribute set "Default" already exists.'; + $expectedMessage = 'An attribute set named "Default" already exists.'; $arguments = [ 'attributeSet' => [ 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 3a6be9535a8..02d8435fb25 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), - 'An attribute set "' . $filterAttributeSet['set_name'] . '" is present in Product Template grid.' + 'An attribute set named "' . $filterAttributeSet['set_name'] . '" is present in Product Template grid.' ); } -- GitLab From 2a75511de574dbf569fd7103f4f6bb8cd5fd3979 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 18 Jun 2015 16:43:28 +0300 Subject: [PATCH 301/396] MAGETWO-38155: Create block for order level --- .../Magento/Integration/Model/CustomerTokenServiceTest.php | 1 + 1 file changed, 1 insertion(+) 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 5da752794e9..427cff705f1 100644 --- a/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Integration/Model/CustomerTokenServiceTest.php @@ -61,6 +61,7 @@ class CustomerTokenServiceTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/Customer/_files/customer.php * @magentoAppIsolation enabled + * @magentoDbIsolation enabled */ public function testCreateCustomerAccessToken() { -- GitLab From abdf9e26be0c62fb95e4064ad3f3b0a04a9010dc Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Thu, 18 Jun 2015 16:47:32 +0300 Subject: [PATCH 302/396] MAGNSWTCH-139: PR stabilization - fixed functional test fail --- .../Catalog/Test/Handler/CatalogProductAttribute/Curl.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php index 692126a34d1..531996bb5b1 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Handler/CatalogProductAttribute/Curl.php @@ -90,7 +90,7 @@ class Curl extends AbstractCurl implements CatalogProductAttributeInterface if ($fixture->hasData('options')) { $optionsData = $fixture->getData()['options']; - foreach ($matches[1] as $key => $optionId) { + foreach (array_unique($matches[1]) as $key => $optionId) { $optionsData[$key]['id'] = $optionId; } $resultData['options'] = $optionsData; -- GitLab From cdbc1ca55b4300284584a3d3f95ee85ba4a4d9f6 Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Thu, 18 Jun 2015 17:34:17 +0300 Subject: [PATCH 303/396] MAGETWO-38836: XSS issues in Magento - wishlist send --- .../Magento/Wishlist/view/frontend/templates/rss/email.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8655b864bc2..7043be8d419 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> -- GitLab From 973d3d8a061dd5618398da5298ab7487f201421d Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 18 Jun 2015 17:51:39 +0300 Subject: [PATCH 304/396] MAGETWO-38155: Create block for order level --- .../testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php | 2 ++ .../Magento/GiftMessage/Api/GuestCartRepositoryTest.php | 2 ++ .../Magento/GiftMessage/Api/GuestItemRepositoryTest.php | 2 ++ .../testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php | 2 ++ 4 files changed, 8 insertions(+) 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 443e464649c..25731e25eb9 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/CartRepositoryTest.php @@ -27,6 +27,8 @@ class CartRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php index 5a907868bf4..57ac51bb126 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php @@ -27,6 +27,8 @@ class GuestCartRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php index a7f15332ca5..c729ea0eccd 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php @@ -27,6 +27,8 @@ class GuestItemRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { 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 9de8af66b24..2dbc24cb67a 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/ItemRepositoryTest.php @@ -27,6 +27,8 @@ class ItemRepositoryTest extends WebapiAbstract /** * @magentoApiDataFixture Magento/GiftMessage/_files/quote_with_item_message.php + * @magentoAppIsolation enabled + * @magentoDbIsolation disabled */ public function testGet() { -- GitLab From 724206423ff5b842287bddc15a9b32175a2803e9 Mon Sep 17 00:00:00 2001 From: Oleg Zinoviev <ozinoviev@ebay.com> Date: Thu, 18 Jun 2015 18:02:40 +0300 Subject: [PATCH 305/396] MAGETWO-37124: All text fields are invisible in Backend Add New Customer page --- .../Magento/backend/web/css/source/forms/_controls.less | 2 +- .../Magento/backend/web/css/source/variables/_actions.less | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 9eead6e7012..e041f6890e8 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 356dc736f9f..9cb67832d16 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,7 @@ @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) - .2rem) / 2), 1); @action__padding-bottom: @field-control__padding-top; @action__height: 3.3rem; -- GitLab From 832b46fc17020ff9de155cf9f1bb3d87bfe2ba8b Mon Sep 17 00:00:00 2001 From: Joan He <joan@x.com> Date: Thu, 18 Jun 2015 09:49:52 -0500 Subject: [PATCH 306/396] MAGETWO-37981: fixed integration tests --- .../TestCase/AbstractBackendController.php} | 43 ++++++++++++++++- .../Adminhtml/Notification/MarkAsReadTest.php | 2 +- .../Notification/MassMarkAsReadTest.php | 2 +- .../Adminhtml/Notification/MassRemoveTest.php | 2 +- .../Adminhtml/Notification/RemoveTest.php | 2 +- .../Backend/App/AbstractActionTest.php | 2 +- .../Adminhtml/Cache/MassActionTest.php | 2 +- .../Controller/Adminhtml/CacheTest.php | 2 +- .../Dashboard/ProductsViewedTest.php | 2 +- .../Controller/Adminhtml/DashboardTest.php | 2 +- .../Controller/Adminhtml/IndexTest.php | 2 +- .../Adminhtml/System/AccountTest.php | 2 +- .../Adminhtml/System/DesignTest.php | 2 +- .../Controller/Adminhtml/System/StoreTest.php | 2 +- .../Controller/Adminhtml/UrlRewriteTest.php | 2 +- .../Utility/BackendAclAbstractTest.php | 47 ------------------- .../Controller/Adminhtml/CategoryTest.php | 2 +- .../Product/Action/AttributeTest.php | 2 +- .../Adminhtml/Product/AttributeTest.php | 2 +- .../Adminhtml/Product/NewActionTest.php | 2 +- .../Adminhtml/Product/ReviewTest.php | 2 +- .../Adminhtml/Product/Set/DeleteTest.php | 2 +- .../Controller/Adminhtml/ProductTest.php | 2 +- .../Adminhtml/Wysiwyg/Images/IndexTest.php | 2 +- .../Adminhtml/System/ConfigTest.php | 2 +- .../Edit/Tab/Super/Config/MatrixTest.php | 2 +- .../Product/Edit/Tab/Super/ConfigTest.php | 2 +- .../Controller/Adminhtml/ProductTest.php | 2 +- .../System/Currency/FetchRatesTest.php | 2 +- .../Adminhtml/System/Currency/IndexTest.php | 2 +- .../System/Currency/SaveRatesTest.php | 2 +- .../System/Currencysymbol/IndexTest.php | 2 +- .../System/Currencysymbol/SaveTest.php | 2 +- .../Cart/Product/Composite/CartTest.php | 2 +- .../Controller/Adminhtml/GroupTest.php | 2 +- .../Controller/Adminhtml/IndexTest.php | 2 +- .../Adminhtml/System/Design/EditorTest.php | 2 +- .../Adminhtml/Downloadable/FileTest.php | 2 +- .../Adminhtml/Email/TemplateTest.php | 2 +- .../Adminhtml/GoogleShopping/ItemsTest.php | 2 +- .../Adminhtml/GoogleShopping/TypesTest.php | 2 +- .../Controller/Adminhtml/ExportTest.php | 2 +- .../Adminhtml/Import/ValidateTest.php | 2 +- .../Controller/Adminhtml/ImportTest.php | 2 +- .../Controller/Adminhtml/IndexerTest.php | 2 +- .../Controller/Adminhtml/IntegrationTest.php | 2 +- .../Adminhtml/NewsletterQueueTest.php | 2 +- .../Adminhtml/NewsletterTemplateTest.php | 2 +- .../System/Config/Form/Field/ExportTest.php | 2 +- .../Adminhtml/Report/Product/ViewedTest.php | 2 +- .../Block/Adminhtml/Order/View/InfoTest.php | 2 +- .../Adminhtml/Order/AddCommentTest.php | 2 +- .../Adminhtml/Order/AddressSaveTest.php | 2 +- .../Adminhtml/Order/AddressTest.php | 2 +- .../Controller/Adminhtml/Order/CancelTest.php | 2 +- .../Controller/Adminhtml/Order/CreateTest.php | 2 +- .../Adminhtml/Order/CreditmemoTest.php | 2 +- .../Controller/Adminhtml/Order/EmailTest.php | 2 +- .../Controller/Adminhtml/Order/HoldTest.php | 2 +- .../Adminhtml/Order/ReviewPaymentTest.php | 2 +- .../Controller/Adminhtml/Order/UnholdTest.php | 2 +- .../Controller/Adminhtml/Order/ViewTest.php | 2 +- .../Sales/Controller/Adminhtml/OrderTest.php | 2 +- .../Adminhtml/Transactions}/FetchTest.php | 4 +- .../Tax/Controller/Adminhtml/RateTest.php | 2 +- .../Tax/Controller/Adminhtml/TaxTest.php | 2 +- .../Adminhtml/Rate}/ExportPostTest.php | 4 +- .../Adminhtml/Rate}/ImportExportTest.php | 6 ++- .../Adminhtml/Rate}/ImportPostTest.php | 6 ++- .../System/Design/ThemeControllerTest.php | 2 +- .../User/Block/User/Edit/Tab/MainTest.php | 2 +- .../User/Controller/Adminhtml/AuthTest.php | 2 +- .../Adminhtml/User/InvalidateTokenTest.php | 2 +- .../Controller/Adminhtml/User/RoleTest.php | 2 +- .../User/Controller/Adminhtml/UserTest.php | 2 +- .../Adminhtml/System/VariableTest.php | 2 +- .../Adminhtml/Widget/InstanceTest.php | 2 +- .../Controller/Adminhtml/WidgetTest.php | 2 +- 78 files changed, 126 insertions(+), 128 deletions(-) rename dev/tests/integration/{testsuite/Magento/Backend/Utility/Controller.php => framework/Magento/TestFramework/TestCase/AbstractBackendController.php} (62%) delete mode 100644 dev/tests/integration/testsuite/Magento/Backend/Utility/BackendAclAbstractTest.php rename dev/tests/integration/testsuite/Magento/{TaxImportExport/Controller/Adminhtml/Rate => Sales/Controller/Adminhtml/Transactions}/FetchTest.php (71%) rename dev/tests/integration/testsuite/Magento/{Sales/Controller/Adminhtml/Transactions => TaxImportExport/Controller/Adminhtml/Rate}/ExportPostTest.php (66%) rename dev/tests/integration/testsuite/Magento/{Sales/Controller/Adminhtml/Transactions => TaxImportExport/Controller/Adminhtml/Rate}/ImportExportTest.php (58%) rename dev/tests/integration/testsuite/Magento/{Sales/Controller/Adminhtml/Transactions => TaxImportExport/Controller/Adminhtml/Rate}/ImportPostTest.php (58%) diff --git a/dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php similarity index 62% rename from dev/tests/integration/testsuite/Magento/Backend/Utility/Controller.php rename to dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php index 1100934f8dc..784e12a3de6 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; + protected function setUp() { parent::setUp(); @@ -70,4 +84,29 @@ class Controller extends \Magento\TestFramework\TestCase\AbstractController ) { parent::assertSessionMessages($constraint, $messageType, $messageManagerClass); } + + + public function testAclHasAccess() + { + if ($this->resource === null) { + $this->markTestIncomplete('Acl test is not complete'); + } + $this->_objectManager->get('Magento\Framework\Acl\Builder') + ->getAcl() + ->allow(null, $this->resource); + $this->dispatch($this->uri); + $this->assertNotSame(403, $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 index 08b6b606db5..06b47f04772 100644 --- a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsReadTest.php +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MarkAsReadTest.php @@ -5,7 +5,7 @@ */ namespace Magento\AdminNotification\Controller\Adminhtml\Notification; -class MarkAsReadTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class MarkAsReadTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index a82d6589fa1..18f3604e29d 100644 --- a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsReadTest.php +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassMarkAsReadTest.php @@ -5,7 +5,7 @@ */ namespace Magento\AdminNotification\Controller\Adminhtml\Notification; -class MassMarkAsReadTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class MassMarkAsReadTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index 066adfc61d9..780e716c5ab 100644 --- a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemoveTest.php +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/MassRemoveTest.php @@ -5,7 +5,7 @@ */ namespace Magento\AdminNotification\Controller\Adminhtml\Notification; -class MassRemoveTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class MassRemoveTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index 201182d55aa..240b91ea122 100644 --- a/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/RemoveTest.php +++ b/dev/tests/integration/testsuite/Magento/AdminNotification/Controller/Adminhtml/Notification/RemoveTest.php @@ -5,7 +5,7 @@ */ namespace Magento\AdminNotification\Controller\Adminhtml\Notification; -class RemoveTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class RemoveTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function setUp() { diff --git a/dev/tests/integration/testsuite/Magento/Backend/App/AbstractActionTest.php b/dev/tests/integration/testsuite/Magento/Backend/App/AbstractActionTest.php index 4578a476df3..e5362e3496e 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 0c6d65b5254..e122d906f21 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 071967d1e5f..7229d95e579 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 72f68982f89..c9749a5aab2 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 f83c3bb77a8..20b193ee77d 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 795c1f2b927..6575448913a 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 a4edd2510d3..983e3dae2d4 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 be0bd223c23..5c6a9c49ef2 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 b84193fcd61..7ce98d848e5 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 51db66afe94..23e50b082be 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/Backend/Utility/BackendAclAbstractTest.php b/dev/tests/integration/testsuite/Magento/Backend/Utility/BackendAclAbstractTest.php deleted file mode 100644 index 8915a5faad4..00000000000 --- a/dev/tests/integration/testsuite/Magento/Backend/Utility/BackendAclAbstractTest.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/*** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Backend\Utility; - -/** - * Contains logic for testing authorization mechanism of controllers - */ -class BackendAclAbstractTest extends \Magento\Backend\Utility\Controller -{ - /** - * The resource used to authorize action - * - * @var string - */ - protected $resource; - - /** - * The uri at which to access the controller - * - * @var string - */ - protected $uri; - - public function testAclHasAccess() - { - \Magento\TestFramework\Helper\Bootstrap::getObjectManager() - ->get('Magento\Framework\Acl\Builder') - ->getAcl() - ->allow(null, $this->resource);; - $this->dispatch($this->uri); - $this->assertNotSame(403, $this->getResponse()->getHttpResponseCode()); - } - - public function testAclNoAccess() - { - \Magento\TestFramework\Helper\Bootstrap::getObjectManager() - ->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/Catalog/Controller/Adminhtml/CategoryTest.php b/dev/tests/integration/testsuite/Magento/Catalog/Controller/Adminhtml/CategoryTest.php index 6f775b962bf..f25bbf1b205 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 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 cb8f0d7354b..276f752779f 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 4b641428516..07b5cac6bb2 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 1af4fd36b8f..b87d11c2c90 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 54c2a94c9e5..b684ee4cebf 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 a8f2d376d96..ddd37fc1cb6 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 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 0ab3f897f2b..6cefed9c36b 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/Cms/Controller/Adminhtml/Wysiwyg/Images/IndexTest.php b/dev/tests/integration/testsuite/Magento/Cms/Controller/Adminhtml/Wysiwyg/Images/IndexTest.php index 2dc7211134a..db421e962fe 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 17507214f58..93300ebe991 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 73ad1be033c..a878e83de05 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 b3c492d07d2..e05edee57e8 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 3bfa19d422a..0f4b46261fa 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/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php b/dev/tests/integration/testsuite/Magento/CurrencySymbol/Controller/Adminhtml/System/Currency/FetchRatesTest.php index 6b2f926e8ad..0a2476e90af 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 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 668d08345f1..66a0af3bc94 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 2b7a4fb0209..0cece519e33 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 cb6cb168ad5..525dcdfb697 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 2f738452630..b5fdfc9fc96 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/Controller/Adminhtml/Cart/Product/Composite/CartTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/Cart/Product/Composite/CartTest.php index e68f3c496b6..482e0d7f7c5 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 93739deb389..9bd876395e6 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'; 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 6eae4325406..5bf29b43297 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 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 ae89b49fb04..7e2b343e043 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 0060e0c3041..81268a5d9d3 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 510e1010304..1e7a3ac5d75 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/GoogleShopping/Controller/Adminhtml/GoogleShopping/ItemsTest.php b/dev/tests/integration/testsuite/Magento/GoogleShopping/Controller/Adminhtml/GoogleShopping/ItemsTest.php index 9862cb8df11..1a6e527bb51 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 6cdcb47a2c4..945d5c45c9d 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 02a60876b9d..f001fae69de 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 4667222256a..56fe1588615 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 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 36e888a964d..75f0021126b 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/Indexer/Controller/Adminhtml/IndexerTest.php b/dev/tests/integration/testsuite/Magento/Indexer/Controller/Adminhtml/IndexerTest.php index 827606d2109..a2c49175f53 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 eec5ee556e9..5c281c22a5f 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 63b8f840c85..cd7a47d9ad1 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 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 3922013af5d..a626b60004c 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 f5a343241c2..695ae56b1f7 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 959036372f2..b2dfd300eac 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 39959964559..94ffd027c1d 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 index 5b68faa50f9..be01007ab38 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddCommentTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddCommentTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class AddCommentTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class AddCommentTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index 17aae2a6595..8859a8453c4 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressSaveTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressSaveTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class AddressSaveTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class AddressSaveTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index c34d908df0e..a986a948e82 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/AddressTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class AddressTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class AddressTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index 4c6af707596..7f37712982a 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CancelTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/CancelTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class CancelTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class CancelTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 9514e649404..edc7f00ce5e 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 5e33aac4557..1f983483016 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 index fe24662dc1a..406511061d4 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/EmailTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/EmailTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class EmailTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class EmailTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index 8e8d0c0351b..8c85de19064 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/HoldTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/HoldTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class HoldTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class HoldTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index 8723d9dbde2..042d5b7b2e2 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ReviewPaymentTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ReviewPaymentTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class ReviewPaymentTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class ReviewPaymentTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index c120423b410..33e83893556 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/UnholdTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/UnholdTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class UnholdTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class UnholdTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 index 74869f35047..f61a32c5080 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ViewTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/ViewTest.php @@ -5,7 +5,7 @@ */ namespace Magento\Sales\Controller\Adminhtml\Order; -class ViewTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class ViewTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 bb770aca97b..4d9d48dd529 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() { diff --git a/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/FetchTest.php b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/FetchTest.php similarity index 71% rename from dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/FetchTest.php rename to dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/FetchTest.php index e49d16678d5..d1191b8fdce 100644 --- a/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/FetchTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/FetchTest.php @@ -5,7 +5,9 @@ */ namespace Magento\Sales\Controller\Adminhtml\Transactions; -class FetchTest extends \Magento\Backend\Utility\BackendAclAbstractTest +use Magento\TestFramework\TestCase\AbstractBackendController; + +class FetchTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 f91ac38ec5e..d308c6834ef 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 f2c5c66bac7..deaef7f6999 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/Sales/Controller/Adminhtml/Transactions/ExportPostTest.php b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPostTest.php similarity index 66% rename from dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ExportPostTest.php rename to dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPostTest.php index 54409561b72..d49cdc7ec84 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ExportPostTest.php +++ b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPostTest.php @@ -3,9 +3,9 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Sales\Controller\Adminhtml\Transactions; +namespace Magento\TaxImportExport\Controller\Adminhtml\Rate; -class ExportPostTest extends \Magento\Backend\Utility\BackendAclAbstractTest +class ExportPostTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function setUp() { diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportExportTest.php b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExportTest.php similarity index 58% rename from dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportExportTest.php rename to dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExportTest.php index 0dcfe24c5e1..34e08d3848b 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportExportTest.php +++ b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportExportTest.php @@ -3,9 +3,11 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Sales\Controller\Adminhtml\Transactions; +namespace Magento\TaxImportExport\Controller\Adminhtml\Rate; -class ImportExportTest extends \Magento\Backend\Utility\BackendAclAbstractTest +use Magento\TestFramework\TestCase\AbstractBackendController; + +class ImportExportTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function setUp() { diff --git a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportPostTest.php b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPostTest.php similarity index 58% rename from dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportPostTest.php rename to dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPostTest.php index 862dfabb041..7034236c8cc 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Transactions/ImportPostTest.php +++ b/dev/tests/integration/testsuite/Magento/TaxImportExport/Controller/Adminhtml/Rate/ImportPostTest.php @@ -3,9 +3,11 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Sales\Controller\Adminhtml\Transactions; +namespace Magento\TaxImportExport\Controller\Adminhtml\Rate; -class ImportPostTest extends \Magento\Backend\Utility\BackendAclAbstractTest +use Magento\TestFramework\TestCase\AbstractBackendController; + +class ImportPostTest extends \Magento\TestFramework\TestCase\AbstractBackendController { public function 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 e33d95da85e..a11f0ed5aee 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/User/Block/User/Edit/Tab/MainTest.php b/dev/tests/integration/testsuite/Magento/User/Block/User/Edit/Tab/MainTest.php index 27f28a4d6f7..79a1ba4425d 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 5b9c0f3f538..052030a1552 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 72df2422c7b..58f4fc2dabe 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 1683937313c..932351fb427 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 f6fa8857422..6755a354da4 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 9b50fdcbc47..f7601ddca76 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/Widget/Controller/Adminhtml/Widget/InstanceTest.php b/dev/tests/integration/testsuite/Magento/Widget/Controller/Adminhtml/Widget/InstanceTest.php index 2f72dcf5219..30dbf0cf181 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 0b36d7cd5b3..90f1d482a23 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() -- GitLab From e9441b5b6129e2944fb6a0e3bc82b36e4a3e58ee Mon Sep 17 00:00:00 2001 From: Leonid Poluyanov <lpoluyanov@ebay.com> Date: Thu, 18 Jun 2015 18:09:23 +0300 Subject: [PATCH 307/396] MAGETWO-37246: Price Permissions not apply for configurable variations - fix tests --- .../Test/Unit/Model/Stock/StockItemRepositoryTest.php | 3 +++ .../Test/Unit/Model/Stock/StockStatusRepositoryTest.php | 3 +++ .../CatalogInventory/Test/Unit/Model/StockRegistryTest.php | 1 + 3 files changed, 7 insertions(+) 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 cfa3ca98c17..ed72a425ea8 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockItemRepositoryTest.php @@ -118,11 +118,13 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase $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') @@ -138,6 +140,7 @@ class StockItemRepositoryTest extends \PHPUnit_Framework_TestCase ->willReturn($this->productMock); $this->queryBuilderFactoryMock = $this->getMockBuilder('Magento\Framework\DB\QueryBuilderFactory') + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->mapperMock = $this->getMockBuilder('Magento\Framework\DB\MapperFactory') diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php index be45e36ff87..19eadb21654 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/Stock/StockStatusRepositoryTest.php @@ -59,14 +59,17 @@ class StockStatusRepositoryTest extends \PHPUnit_Framework_TestCase $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') diff --git a/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php index 08d51ff34a4..0c7cdea123e 100644 --- a/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php +++ b/app/code/Magento/CatalogInventory/Test/Unit/Model/StockRegistryTest.php @@ -27,6 +27,7 @@ class StockRegistryTest extends \PHPUnit_Framework_TestCase ->getMock(); $criteriaFactory = $this->getMockBuilder('Magento\CatalogInventory\Api\StockItemCriteriaInterfaceFactory') + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $criteriaFactory->expects($this->once())->method('create')->willReturn($this->criteria); -- GitLab From 4edf34a53feda13de42c77deb64ac458524a146b Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Thu, 18 Jun 2015 18:19:40 +0300 Subject: [PATCH 308/396] MTA-2350: Add wait to form element before filling a value --- .../CreateCmsPageRewriteEntityTest.php | 2 +- .../Edit/Tab/Super/Config/Attribute.php | 7 ++++++- .../Block/Adminhtml/Product/ProductForm.php | 1 + .../System/Currency/Rate/CurrencyRateForm.xml | 2 +- .../Adminhtml/System/CurrencySymbolForm.php | 6 +++++- .../UpdateDownloadableProductEntityTest.xml | 1 - .../Tax/Test/Constraint/AssertTaxRateForm.php | 18 ++++++++++++------ .../Test/TestCase/UpdateTaxRateEntityTest.xml | 10 ---------- .../Adminhtml/Catalog/Edit/UrlRewriteForm.php | 8 +++++++- 9 files changed, 33 insertions(+), 22 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php index 5023d9a37f2..5a0511def48 100644 --- a/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php +++ b/dev/tests/functional/tests/app/Magento/Cms/Test/TestCase/CreateCmsPageRewriteEntityTest.php @@ -75,7 +75,7 @@ class CreateCmsPageRewriteEntityTest extends Injectable //Steps $this->urlRewriteIndex->open(); $this->urlRewriteIndex->getPageActionsBlock()->addNew(); - $this->urlRewriteEdit->getFormBlock()->fill($urlRewrite); + $this->urlRewriteEdit->getUrlRewriteTypeSelectorBlock()->selectType($urlRewrite->getEntityType()); $cmsPage = $urlRewrite->getDataFieldConfig('target_path')['source']->getEntity(); $filter = ['title' => $cmsPage->getTitle()]; $this->urlRewriteEdit->getCmsGridBlock()->searchAndOpen($filter); diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php index 23714ad9437..784950f01a6 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php @@ -247,7 +247,12 @@ class Attribute extends Form $attributeBlock->find($this->addOption)->click(); } $mapping = $this->dataMapping($option); - $this->_fill($mapping, $optionContainer); + foreach ($mapping as $name => $field) { + $element = $this->getElement($optionContainer, $field); + if ($element->isVisible() && !$element->isDisabled()) { + $element->setValue($field['value']); + } + } } } diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php index 1fbc66894ce..6b79d3f4378 100755 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/ProductForm.php @@ -34,6 +34,7 @@ class ProductForm extends \Magento\Catalog\Test\Block\Adminhtml\Product\ProductF } $this->showAdvancedSettings(); + $this->getTab('variations')->showContent(); return $this->fillTabs($tabs, $element); } } diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml index 4ffc8f05740..333fd02a273 100644 --- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml +++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/Currency/Rate/CurrencyRateForm.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <wrapper>rate</wrapper> <fields> <rate> diff --git a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php index 2f758e545f4..33e1e795ca9 100644 --- a/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php +++ b/dev/tests/functional/tests/app/Magento/CurrencySymbol/Test/Block/Adminhtml/System/CurrencySymbolForm.php @@ -34,6 +34,10 @@ class CurrencySymbolForm extends Form public function fill(FixtureInterface $fixture, SimpleElement $element = null) { $element = $this->_rootElement->find(sprintf($this->currencyRow, $fixture->getCode()), Locator::SELECTOR_XPATH); - return parent::fill($fixture, $element); + $data = $fixture->getData(); + unset($data['code']); + $mapping = $this->dataMapping($data); + $this->_fill($mapping, $element); + return $this; } } diff --git a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml index 69a8cb56138..10ba00e4d5d 100644 --- a/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Downloadable/Test/TestCase/UpdateDownloadableProductEntityTest.xml @@ -114,7 +114,6 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">10</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/weight" xsi:type="string">10</data> <data name="product/data/special_price" xsi:type="string">40</data> <data name="isRequired" xsi:type="string">No</data> <data name="product/data/url_key" xsi:type="string">downloadableproduct-%isolation%</data> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php index 970bede06de..1a3958a95c3 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php @@ -31,10 +31,7 @@ class AssertTaxRateForm extends AbstractConstraint TaxRate $taxRate, TaxRate $initialTaxRate = null ) { - $data = ($initialTaxRate !== null) - ? array_merge($initialTaxRate->getData(), $taxRate->getData()) - : $taxRate->getData(); - $data = $this->prepareData($data); + $data = $this->prepareData($taxRate, $initialTaxRate); $filter = [ 'code' => $data['code'], ]; @@ -53,11 +50,20 @@ class AssertTaxRateForm extends AbstractConstraint /** * Preparing data for verification * - * @param array $data + * @param TaxRate $taxRate + * @param TaxRate $initialTaxRate * @return array */ - protected function prepareData(array $data) + protected function prepareData(TaxRate $taxRate, TaxRate $initialTaxRate) { + if ($initialTaxRate !== null) { + $data = array_merge($initialTaxRate->getData(), $taxRate->getData()); + if ($taxRate->hasData('tax_country_id') && !$taxRate->hasData('tax_region_id')) { + unset($data['tax_region_id']); + } + } else { + $data = $taxRate->getData(); + } if ($data['zip_is_range'] === 'Yes') { unset($data['tax_postcode']); } else { diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml index 4af48b0765f..c8205ff306c 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/TestCase/UpdateTaxRateEntityTest.xml @@ -11,8 +11,6 @@ <data name="initialTaxRate/dataSet" xsi:type="string">default</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">90001</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United States</data> <data name="taxRate/data/tax_region_id" xsi:type="string">California</data> @@ -27,7 +25,6 @@ <data name="taxRate/data/zip_is_range" xsi:type="string">Yes</data> <data name="taxRate/data/zip_from" xsi:type="string">90001</data> <data name="taxRate/data/zip_to" xsi:type="string">96162</data> - <data name="taxRate/data/tax_postcode" xsi:type="string">-</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United States</data> <data name="taxRate/data/tax_region_id" xsi:type="string">California</data> <data name="taxRate/data/rate" xsi:type="string">15.05</data> @@ -39,8 +36,6 @@ <data name="initialTaxRate/dataSet" xsi:type="string">default</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">*</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> <data name="taxRate/data/rate" xsi:type="string">777</data> @@ -52,8 +47,6 @@ <data name="initialTaxRate/dataSet" xsi:type="string">withZipRange</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">180</data> <data name="taxRate/data/tax_country_id" xsi:type="string">Canada</data> <data name="taxRate/data/tax_region_id" xsi:type="string">*</data> @@ -68,7 +61,6 @@ <data name="taxRate/data/zip_is_range" xsi:type="string">Yes</data> <data name="taxRate/data/zip_from" xsi:type="string">1</data> <data name="taxRate/data/zip_to" xsi:type="string">7800935</data> - <data name="taxRate/data/tax_postcode" xsi:type="string">-</data> <data name="taxRate/data/tax_country_id" xsi:type="string">United Kingdom</data> <data name="taxRate/data/rate" xsi:type="string">12.99</data> <constraint name="Magento\Tax\Test\Constraint\AssertTaxRateSuccessSaveMessage" /> @@ -78,8 +70,6 @@ <data name="initialTaxRate/dataSet" xsi:type="string">withZipRange</data> <data name="taxRate/data/code" xsi:type="string">TaxIdentifier%isolation%</data> <data name="taxRate/data/zip_is_range" xsi:type="string">No</data> - <data name="taxRate/data/zip_from" xsi:type="string">-</data> - <data name="taxRate/data/zip_to" xsi:type="string">-</data> <data name="taxRate/data/tax_postcode" xsi:type="string">*</data> <data name="taxRate/data/tax_country_id" xsi:type="string">France</data> <data name="taxRate/data/tax_region_id" xsi:type="string">Val-d'Oise</data> diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php index c03527b655a..4556ab35a49 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php @@ -29,6 +29,7 @@ class UrlRewriteForm extends Form SimpleElement $element = null, array $replace = [] ) { + $context = ($element === null) ? $this->_rootElement : $element; $data = $fixture->getData(); if (empty($data['entity_type']) && empty($this->getData()['target_path']) && !isset($data['target_path'])) { $entity = $fixture->getDataFieldConfig('target_path')['source']->getEntity(); @@ -44,7 +45,12 @@ class UrlRewriteForm extends Form } $mapping = $this->dataMapping($data); - $this->_fill($mapping, $element); + foreach ($mapping as $name => $field) { + $element = $this->getElement($context, $field); + if ($element->isVisible() && !$element->isDisabled()) { + $element->setValue($field['value']); + } + } return $this; } -- GitLab From e3bcfbfe6627137e585c831aa66e9bc28c732d51 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Thu, 18 Jun 2015 10:43:42 -0500 Subject: [PATCH 309/396] MAGETWO-38065: /magento_verion exposes too detailed version information - return blank page if bad version found --- .htaccess | 2 +- app/code/Magento/Version/Controller/Index/Index.php | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.htaccess b/.htaccess index 01f8f8dd24d..b48c8689c8c 100644 --- a/.htaccess +++ b/.htaccess @@ -187,4 +187,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/Version/Controller/Index/Index.php b/app/code/Magento/Version/Controller/Index/Index.php index 610d98e5889..3d71b3e7446 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 @@ -34,12 +35,16 @@ class Index extends Action * Sets the response body to ProductName/Major.MinorVersion (Edition). E.g.: Magento/0.42 (Community). Omits patch * version from response * + * @throws StateException * @return void */ public function execute() { - $fullVersion = explode('.', $this->productMetadata->getVersion()); - $majorMinorVersion = $fullVersion[0] . '.' . $fullVersion[1]; + $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() . '/' . $majorMinorVersion . ' (' . -- GitLab From 4b226f8faac346b5fb6be694fd9f96727c6664bc Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Thu, 18 Jun 2015 11:05:25 -0500 Subject: [PATCH 310/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - update docblock descriptions and typehints --- .../Framework/DB/Adapter/Pdo/Mysql.php | 5 ++-- .../Framework/DB/ExpressionConverter.php | 29 ++++++++++--------- .../Framework/Mview/View/Subscription.php | 3 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php index 3e4bdf4eb34..5a00957dc51 100644 --- a/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php +++ b/lib/internal/Magento/Framework/DB/Adapter/Pdo/Mysql.php @@ -3123,7 +3123,7 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface * * @param string $tableName * @return string - * @codeCoverageIgnore Covered by tests on ExpressionConverter + * @codeCoverageIgnore */ public function getTableName($tableName) { @@ -3137,7 +3137,7 @@ class Mysql extends \Zend_Db_Adapter_Pdo_Mysql implements AdapterInterface * @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 Covered by tests on ExpressionConverter + * @codeCoverageIgnore */ public function getTriggerName($tableName, $time, $event) @@ -3184,6 +3184,7 @@ 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) { diff --git a/lib/internal/Magento/Framework/DB/ExpressionConverter.php b/lib/internal/Magento/Framework/DB/ExpressionConverter.php index 05a6d345b35..9a9b2d7eacf 100644 --- a/lib/internal/Magento/Framework/DB/ExpressionConverter.php +++ b/lib/internal/Magento/Framework/DB/ExpressionConverter.php @@ -15,7 +15,7 @@ class ExpressionConverter const MYSQL_IDENTIFIER_LEN = 64; /** - * Dictionary for generate short name + * Dictionary maps common words in identifiers to abbreviations * * @var array */ @@ -67,7 +67,7 @@ class ExpressionConverter ]; /** - * Convert name using dictionary + * Shorten name by abbreviating words * * @param string $name * @return string @@ -78,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 @@ -90,30 +90,33 @@ class ExpressionConverter } /** - * @param string $tableName + * 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($tableName, $prefix) + public static function shortenEntityName($entityName, $prefix) { - if (strlen($tableName) > self::MYSQL_IDENTIFIER_LEN) { - $shortName = ExpressionConverter::shortName($tableName); + if (strlen($entityName) > self::MYSQL_IDENTIFIER_LEN) { + $shortName = ExpressionConverter::shortName($entityName); if (strlen($shortName) > self::MYSQL_IDENTIFIER_LEN) { - $hash = md5($tableName); + $hash = md5($entityName); if (strlen($prefix . $hash) > self::MYSQL_IDENTIFIER_LEN) { - $tableName = self::trimHash($hash, $prefix, self::MYSQL_IDENTIFIER_LEN); + $entityName = self::trimHash($hash, $prefix, self::MYSQL_IDENTIFIER_LEN); } else { - $tableName = $prefix . $hash; + $entityName = $prefix . $hash; } } else { - $tableName = $shortName; + $entityName = $shortName; } } - return $tableName; + return $entityName; } /** - * Remove superfluous characters from hash. + * Remove superfluous characters from hash * * @param string $hash * @param string $prefix diff --git a/lib/internal/Magento/Framework/Mview/View/Subscription.php b/lib/internal/Magento/Framework/Mview/View/Subscription.php index e22e5efda45..e72c255d750 100644 --- a/lib/internal/Magento/Framework/Mview/View/Subscription.php +++ b/lib/internal/Magento/Framework/Mview/View/Subscription.php @@ -10,7 +10,6 @@ namespace Magento\Framework\Mview\View; use Magento\Framework\App\Resource; use Magento\Framework\DB\Ddl\Trigger; -use Magento\Framework\DB\ExpressionConverter; class Subscription implements SubscriptionInterface { @@ -22,7 +21,7 @@ class Subscription implements SubscriptionInterface protected $write; /** - * @var Trigger + * @var \Magento\Framework\DB\Ddl\TriggerFactory */ protected $triggerFactory; -- GitLab From 75ad074ad0aa3ef8b64e91eb62ee78b8245d2bea Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Thu, 18 Jun 2015 11:06:46 -0500 Subject: [PATCH 311/396] MAGETWO-38065: /magento_verion exposes too detailed version information - delete incorrect @throws docblock flag --- app/code/Magento/Version/Controller/Index/Index.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/Magento/Version/Controller/Index/Index.php b/app/code/Magento/Version/Controller/Index/Index.php index 3d71b3e7446..62bb63b30ee 100644 --- a/app/code/Magento/Version/Controller/Index/Index.php +++ b/app/code/Magento/Version/Controller/Index/Index.php @@ -35,7 +35,6 @@ class Index extends Action * Sets the response body to ProductName/Major.MinorVersion (Edition). E.g.: Magento/0.42 (Community). Omits patch * version from response * - * @throws StateException * @return void */ public function execute() -- GitLab From 860906b1b80373edbd10729c0cfff0f22f80ea97 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 18 Jun 2015 19:09:37 +0300 Subject: [PATCH 312/396] MAGETWO-38155: Create block for order level --- app/code/Magento/GiftMessage/etc/webapi.xml | 64 --------------------- 1 file changed, 64 deletions(-) diff --git a/app/code/Magento/GiftMessage/etc/webapi.xml b/app/code/Magento/GiftMessage/etc/webapi.xml index bb0b2f07956..d3ee787723e 100644 --- a/app/code/Magento/GiftMessage/etc/webapi.xml +++ b/app/code/Magento/GiftMessage/etc/webapi.xml @@ -32,68 +32,4 @@ <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> -- GitLab From a489684f0cadeb32df48aadefa3348ef833cfb8f Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 18 Jun 2015 19:46:17 +0300 Subject: [PATCH 313/396] MAGETWO-38155: Create block for order level --- .../Magento/GiftMessage/Api/GuestCartRepositoryTest.php | 2 +- .../Magento/GiftMessage/Api/GuestItemRepositoryTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php index 57ac51bb126..2d2da9d2ff9 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestCartRepositoryTest.php @@ -12,7 +12,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract; class GuestCartRepositoryTest extends WebapiAbstract { const SERVICE_VERSION = 'V1'; - const SERVICE_NAME = 'giftMessageCartRepositoryV1'; + const SERVICE_NAME = 'giftMessageGuestCartRepositoryV1'; const RESOURCE_PATH = '/V1/guest-carts/'; /** diff --git a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php index c729ea0eccd..c749c3b39ee 100644 --- a/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php +++ b/dev/tests/api-functional/testsuite/Magento/GiftMessage/Api/GuestItemRepositoryTest.php @@ -12,7 +12,7 @@ use Magento\TestFramework\TestCase\WebapiAbstract; class GuestItemRepositoryTest extends WebapiAbstract { const SERVICE_VERSION = 'V1'; - const SERVICE_NAME = 'giftMessageItemRepositoryV1'; + const SERVICE_NAME = 'giftMessageGuestItemRepositoryV1'; const RESOURCE_PATH = '/V1/guest-carts/'; /** -- GitLab From 4c7058e0838a38fafb7a63bd7f6bff10ce657a68 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Thu, 18 Jun 2015 20:02:20 +0300 Subject: [PATCH 314/396] MAGETWO-38954: UnitTest Coverage Magento\Reports* --- .../Test/Unit/Model/Resource/EventTest.php | 249 ++++++++++++++++++ .../Test/Unit/Model/Resource/HelperTest.php | 123 +++++++++ .../Model/Resource/Report/CollectionTest.php | 184 ++++++++++++- 3 files changed, 546 insertions(+), 10 deletions(-) create mode 100644 app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php create mode 100644 app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php 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 00000000000..98aabc602cc --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php @@ -0,0 +1,249 @@ +<?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') + ->disableOriginalConstructor() + ->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 00000000000..55e09c7be83 --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php @@ -0,0 +1,123 @@ +<?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') + ->disableOriginalConstructor() + ->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/Report/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/CollectionTest.php index c1e8adeeee7..ca08b3b2176 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); } } -- GitLab From 4143586a2023d2de19ccecc946169188053892c9 Mon Sep 17 00:00:00 2001 From: Joan He <joan@x.com> Date: Thu, 18 Jun 2015 12:28:41 -0500 Subject: [PATCH 315/396] MAGETWO-37981: fixed integration tests --- .../TestFramework/TestCase/AbstractBackendController.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php index 784e12a3de6..ede847118f3 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php +++ b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php @@ -34,7 +34,7 @@ abstract class AbstractBackendController extends \Magento\TestFramework\TestCase * * @var string */ - protected $uri; + protected $uri = null; protected function setUp() { @@ -88,12 +88,9 @@ abstract class AbstractBackendController extends \Magento\TestFramework\TestCase public function testAclHasAccess() { - if ($this->resource === null) { - $this->markTestIncomplete('Acl test is not complete'); + if ($this->uri === null) { + $this->markTestIncomplete('AclHasAccess test is not complete'); } - $this->_objectManager->get('Magento\Framework\Acl\Builder') - ->getAcl() - ->allow(null, $this->resource); $this->dispatch($this->uri); $this->assertNotSame(403, $this->getResponse()->getHttpResponseCode()); } -- GitLab From 2aa4989ec20ad100d5dab59583b489b36eba46df Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Thu, 18 Jun 2015 13:50:42 -0500 Subject: [PATCH 316/396] MAGETWO-16192: Security: Clickjacking solution - introduce X-Frame-Options - add unit test --- lib/internal/Magento/Framework/App/Response/Http.php | 1 - .../Magento/Framework/App/Response/XFrameOptPlugin.php | 2 +- .../Magento/Framework/App/Test/Unit/Response/HttpTest.php | 7 +++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/internal/Magento/Framework/App/Response/Http.php b/lib/internal/Magento/Framework/App/Response/Http.php index 864a203cf98..3f419b71acf 100644 --- a/lib/internal/Magento/Framework/App/Response/Http.php +++ b/lib/internal/Magento/Framework/App/Response/Http.php @@ -59,7 +59,6 @@ class Http extends \Magento\Framework\HTTP\PhpEnvironment\Response * * @param string $value * @return void - * @codeCoverageIgnore */ public function setXFrameOptions($value) { diff --git a/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php b/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php index d3441ccc271..1bae23efcb0 100644 --- a/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php +++ b/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php @@ -8,7 +8,6 @@ namespace Magento\Framework\App\Response; /** * Adds an X-FRAME-OPTIONS header to HTTP responses to safeguard against click-jacking. - * @codeCoverageIgnore */ class XFrameOptPlugin { @@ -35,6 +34,7 @@ class XFrameOptPlugin /** * @param \Magento\Framework\App\Response\Http $subject * @return void + * @codeCoverageIgnore */ public function beforeSendResponse(\Magento\Framework\App\Response\Http $subject) { 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 3fb38007f0a..7bacd6ea6fe 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 = 'SAMEORIGIN'; + $this->model->setXFrameOptions($value); + $this->assertSame($value, $this->model->getHeader(Http::HEADER_X_FRAME_OPT)->getFieldValue()); + } } -- GitLab From 0460a684a48cd973296535352e15c21a1a8e4e87 Mon Sep 17 00:00:00 2001 From: Joan He <joan@x.com> Date: Thu, 18 Jun 2015 15:25:46 -0500 Subject: [PATCH 317/396] MAGETWO-37981: fixed integration tests --- .../Magento/TestFramework/TestCase/AbstractBackendController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php index ede847118f3..8ae817b42ce 100644 --- a/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php +++ b/dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php @@ -93,6 +93,7 @@ abstract class AbstractBackendController extends \Magento\TestFramework\TestCase } $this->dispatch($this->uri); $this->assertNotSame(403, $this->getResponse()->getHttpResponseCode()); + $this->assertNotSame(404, $this->getResponse()->getHttpResponseCode()); } public function testAclNoAccess() -- GitLab From b1811e98a62d87f9bdfa36712cc43740beb2a657 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Fri, 19 Jun 2015 10:24:56 +0300 Subject: [PATCH 318/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - fixes after CR --- .../Magento/Review/Controller/Adminhtml/Product/MassDelete.php | 2 +- .../Magento/Sales/Controller/Adminhtml/Order/AddComment.php | 2 +- .../Sales/Controller/Adminhtml/Order/Creditmemo/AddComment.php | 2 +- .../Sales/Controller/Adminhtml/Order/Invoice/AddComment.php | 2 +- .../Controller/Adminhtml/Order/Creditmemo/AddCommentTest.php | 2 +- .../Shipping/Controller/Adminhtml/Order/Shipment/AddComment.php | 2 +- .../testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php b/app/code/Magento/Review/Controller/Adminhtml/Product/MassDelete.php index d9e43c07b5f..6a64c6cf549 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, __('Something went wrong 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/Sales/Controller/Adminhtml/Order/AddComment.php b/app/code/Magento/Sales/Controller/Adminhtml/Order/AddComment.php index 335f5a7a588..c313dc7d25f 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(__('Please enter comment text.')); + throw new \Magento\Framework\Exception\LocalizedException(__('Please enter a comment.')); } $notify = isset($data['is_customer_notified']) ? $data['is_customer_notified'] : false; 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 5fb2397783f..a3cf6e6a308 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( - __('Please enter Comment Text.') + __('Please enter a comment.') ); } $this->creditmemoLoader->setOrderId($this->getRequest()->getParam('order_id')); 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 c0d5da182cc..2be526b2129 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(__('Please enter Comment Text.')); + throw new LocalizedException(__('Please enter a comment.')); } $invoice = $this->getInvoice(); if (!$invoice) { 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 f0985a0eaf9..b96f2254501 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 = 'Please enter Comment Text.'; + $message = 'Please enter a comment.'; $response = ['error' => true, 'message' => $message]; $data = []; 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 1fb2e58610f..fb24a2a3258 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( - __('Please enter Comment Text.') + __('Please enter a comment.') ); } $this->shipmentLoader->setOrderId($this->getRequest()->getParam('order_id')); 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 19216e4265a..8b19d20b99d 100644 --- a/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php +++ b/dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/OrderTest.php @@ -100,7 +100,7 @@ class OrderTest extends \Magento\Backend\Utility\Controller [ 'status' => 'processing', 'comment' => '', - 'response' => '{"error":true,"message":"Please enter comment text."}' + 'response' => '{"error":true,"message":"Please enter a comment."}' ] ]; } -- GitLab From 99f7db8e95a10b1fb6c8b5b729aafd1715c45120 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 19 Jun 2015 11:45:06 +0300 Subject: [PATCH 319/396] MAGETWO-38155: Create block for order level --- app/code/Magento/GiftMessage/etc/webapi.xml | 64 +++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/app/code/Magento/GiftMessage/etc/webapi.xml b/app/code/Magento/GiftMessage/etc/webapi.xml index d3ee787723e..bb0b2f07956 100644 --- a/app/code/Magento/GiftMessage/etc/webapi.xml +++ b/app/code/Magento/GiftMessage/etc/webapi.xml @@ -32,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> -- GitLab From 6c391df2b03317f38ec69495e5cb66e4e525b906 Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Fri, 19 Jun 2015 11:49:07 +0300 Subject: [PATCH 320/396] MTA-2350: Add wait to form element before filling a value --- ...roductCustomOptionsOnBundleProductPage.php | 3 +- .../AssertTierPriceOnBundleProductPage.php | 2 +- .../Test/Fixture/BundleProduct/Price.php | 10 +-- .../CreateBundleProductEntityTest.xml | 3 +- .../Test/Repository/CatalogProductVirtual.xml | 17 ++++ .../ProductTypeSwitchingOnCreationTest.xml | 4 +- .../ProductTypeSwitchingOnUpdateTest.xml | 4 +- .../Test/Block/Adminhtml/ReviewForm.php | 36 ++++++-- .../Test/Block/Adminhtml/ReviewForm.xml | 2 +- .../Constraint/AssertProductReviewInGrid.php | 16 ++-- .../CreateProductReviewBackendEntityTest.xml | 85 +++++++++---------- 11 files changed, 108 insertions(+), 74 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php index 308ebbe8256..dcb74539acd 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertProductCustomOptionsOnBundleProductPage.php @@ -9,8 +9,7 @@ namespace Magento\Bundle\Test\Constraint; use Magento\Catalog\Test\Constraint\AssertProductCustomOptionsOnProductPage; /** - * Class AssertProductCustomOptionsOnBundleProductPage - * Assertion that commodity options are displayed correctly on bundle product page + * Assertion that commodity options are displayed correctly on bundle product page. */ class AssertProductCustomOptionsOnBundleProductPage extends AssertProductCustomOptionsOnProductPage { diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php index 3c62ea1c4ea..156e24f75aa 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Constraint/AssertTierPriceOnBundleProductPage.php @@ -32,7 +32,7 @@ class AssertTierPriceOnBundleProductPage extends AssertProductTierPriceOnProduct * * @var int */ - protected $priceFormat = 4; + protected $priceFormat = 0; /** * Assertion that tier prices are displayed correctly diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php b/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php index a30b316e1e8..c4f0aee1ebe 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/Fixture/BundleProduct/Price.php @@ -139,13 +139,13 @@ class Price implements FixtureInterface 'price_to' => '120.00', ], 'fixed-115' => [ - 'price_from' => '115.00', - 'price_to' => '120.00', + 'price_from' => '317.00', + 'price_to' => '362.00', 'cart_price' => '317.00', ], - 'fixed-159' => [ - 'price_from' => '115.00', - 'price_to' => '120.00', + 'fixed-110' => [ + 'price_from' => '159.00', + 'price_to' => '164.00', 'cart_price' => '159.00', ], 'fixed-756' => [ diff --git a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml index 51d270f4d41..ad5b9bfa0c0 100644 --- a/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Bundle/Test/TestCase/CreateBundleProductEntityTest.xml @@ -228,7 +228,6 @@ <constraint name="Magento\Bundle\Test\Constraint\AssertBundlePriceType" /> </variation> <variation name="CreateBundleProductEntityTestVariation10"> - <data name="tag" xsi:type="string">to_maintain:yes</data> <data name="description" xsi:type="string">Create dynamic bundle</data> <data name="product/data/url_key" xsi:type="string">bundle-product-%isolation%</data> <data name="product/data/name" xsi:type="string">Bundle Dynamic %isolation%</data> @@ -272,7 +271,7 @@ <data name="product/data/sku" xsi:type="string">sku_bundle_fixed_%isolation%</data> <data name="product/data/price_type" xsi:type="string">Fixed</data> <data name="product/data/price/value" xsi:type="string">110</data> - <data name="product/data/price/preset" xsi:type="string">fixed-159</data> + <data name="product/data/price/preset" xsi:type="string">fixed-110</data> <data name="product/data/bundle_selections/preset" xsi:type="string">second</data> <data name="product/data/bundle_selections/products" xsi:type="string">catalogProductSimple::product_100_dollar,catalogProductSimple::product_40_dollar</data> <data name="product/data/checkout_data/preset" xsi:type="string">with_custom_options_2</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml index cc82e98b336..2e2903a0cf3 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Repository/CatalogProductVirtual.xml @@ -36,6 +36,23 @@ </field> </dataset> + <dataset name="required_fields"> + <field name="url_key" xsi:type="string">virtual-product%isolation%</field> + <field name="name" xsi:type="string">Virtual product %isolation%</field> + <field name="sku" xsi:type="string">sku_virtual_product_%isolation%</field> + <field name="is_virtual" xsi:type="string">Yes</field> + <field name="price" xsi:type="array"> + <item name="value" xsi:type="string">10</item> + <item name="preset" xsi:type="string">-</item> + </field> + <field name="tax_class_id" xsi:type="array"> + <item name="dataSet" xsi:type="string">taxable_goods</item> + </field> + <field name="website_ids" xsi:type="array"> + <item name="0" xsi:type="string">Main Website</item> + </field> + </dataset> + <dataset name="required_fields_with_category"> <field name="url_key" xsi:type="string">virtual-product%isolation%</field> <field name="name" xsi:type="string">Virtual product %isolation%</field> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml index af77d4f6fd3..d4850eed962 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnCreationTest.xml @@ -27,13 +27,13 @@ </variation> <variation name="ProductTypeSwitchingOnCreationTestVariation3"> <data name="createProduct" xsi:type="string">configurable</data> - <data name="product" xsi:type="string">catalogProductSimple::default</data> + <data name="product" xsi:type="string">catalogProductSimple::product_without_category</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnCreationTestVariation4"> <data name="createProduct" xsi:type="string">configurable</data> - <data name="product" xsi:type="string">catalogProductVirtual::default</data> + <data name="product" xsi:type="string">catalogProductVirtual::required_fields</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml index 21b11f5fdfa..8d1fc4b9e09 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/ProductTypeSwitchingOnUpdateTest.xml @@ -28,14 +28,14 @@ </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation3"> <data name="productOrigin" xsi:type="string">configurableProduct::default</data> - <data name="product" xsi:type="string">catalogProductSimple::default</data> + <data name="product" xsi:type="string">catalogProductSimple::product_without_category</data> <data name="actionName" xsi:type="string">deleteAttributes</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> </variation> <variation name="ProductTypeSwitchingOnUpdateTestVariation4"> <data name="productOrigin" xsi:type="string">configurableProduct::default</data> - <data name="product" xsi:type="string">catalogProductVirtual::default</data> + <data name="product" xsi:type="string">catalogProductVirtual::required_fields</data> <data name="actionName" xsi:type="string">deleteAttributes</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php index 90c86209338..c3ad0a3ef2d 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.php @@ -8,36 +8,56 @@ namespace Magento\Review\Test\Block\Adminhtml; use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** - * Class Edit - * Review edit form + * Review edit form. */ class ReviewForm extends Form { /** - * Posted by field + * Posted by field. * * @var string */ protected $customer = '#customer'; /** - * Rating status + * Rating status. * * @var string */ protected $status = '[name=status_id]'; /** - * 'Save Review' button + * 'Save Review' button. * * @var string */ protected $saveButton = '[data-ui-id$=save-button-button]'; /** - * Get data from 'Posted By' field + * Fill the review form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + if (isset($data['entity_id'])) { + unset($data['entity_id']); + } + $mapping = $this->dataMapping($data); + $this->_fill($mapping, $element); + + return $this; + } + + /** + * Get data from 'Posted By' field. * * @return string */ @@ -47,7 +67,7 @@ class ReviewForm extends Form } /** - * Get data from Status field + * Get data from Status field. * * @return string */ @@ -57,7 +77,7 @@ class ReviewForm extends Form } /** - * Set approve review + * Set approve review. * * @return void */ diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml index d1065de6f48..c1e452cd040 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Block/Adminhtml/ReviewForm.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="1"> +<mapping strict="0"> <fields> <status_id> <input>select</input> diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php index b448f3ac837..93e28f758b9 100755 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewInGrid.php @@ -12,13 +12,12 @@ use Magento\Mtf\Constraint\AbstractConstraint; use Magento\Mtf\Fixture\FixtureInterface; /** - * Class AssertProductReviewInGrid - * Check that review is displayed in grid + * Check that review is displayed in grid. */ class AssertProductReviewInGrid extends AbstractConstraint { /** - * Filter params + * Filter params. * * @var array */ @@ -35,10 +34,10 @@ class AssertProductReviewInGrid extends AbstractConstraint ]; /** - * Assert that review is displayed in grid + * Assert that review is displayed in grid. * * @param ReviewIndex $reviewIndex - * @param Review $review , + * @param Review $review * @param FixtureInterface $product * @param string $gridStatus * @return void @@ -61,7 +60,7 @@ class AssertProductReviewInGrid extends AbstractConstraint } /** - * Prepare filter for assert + * Prepare filter for assert. * * @param FixtureInterface $product * @param array $review @@ -89,6 +88,9 @@ class AssertProductReviewInGrid extends AbstractConstraint case 'status_id': $value = $gridStatus != '' ? $gridStatus : (isset($review[$param]) ? $review[$param] : null); break; + case 'type': + $value = isset($review[$param]) ? $review[$param] : 'Administrator'; + break; default: $value = isset($review[$param]) ? $review[$param] : null; break; @@ -101,7 +103,7 @@ class AssertProductReviewInGrid extends AbstractConstraint } /** - * Text success exist review in grid on product reviews tab + * Text success exist review in grid on product reviews tab. * * @return string */ diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml index bf97a39b60e..ee97d7bb214 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewBackendEntityTest.xml @@ -6,48 +6,45 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Review\Test\TestCase\CreateProductReviewBackendEntityTest"> - <variation name="CreateProductReviewBackendEntityTestVariation1"> - <data name="review/data/type" xsi:type="string">Administrator</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="review/data/status_id" xsi:type="string">Approved</data> - <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/rating_0/rating" xsi:type="string">3</data> - <data name="review/data/nickname" xsi:type="string">John</data> - <data name="review/data/title" xsi:type="string">title %isolation%</data> - <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - <variation name="CreateProductReviewBackendEntityTestVariation2"> - <data name="review/data/type" xsi:type="string">Administrator</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="review/data/status_id" xsi:type="string">Pending</data> - <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/rating_0/rating" xsi:type="string">4</data> - <data name="review/data/nickname" xsi:type="string">Britney</data> - <data name="review/data/title" xsi:type="string">title %isolation%</data> - <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - <variation name="CreateProductReviewBackendEntityTestVariation3"> - <data name="review/data/type" xsi:type="string">Administrator</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="review/data/status_id" xsi:type="string">Not Approved</data> - <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> - <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/rating_0/rating" xsi:type="string">5</data> - <data name="review/data/nickname" xsi:type="string">Michael</data> - <data name="review/data/title" xsi:type="string">title %isolation%</data> - <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - </testCase> + <testCase name="Magento\Review\Test\TestCase\CreateProductReviewBackendEntityTest"> + <variation name="CreateProductReviewBackendEntityTestVariation1"> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="review/data/status_id" xsi:type="string">Approved</data> + <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/rating_0/rating" xsi:type="string">3</data> + <data name="review/data/nickname" xsi:type="string">John</data> + <data name="review/data/title" xsi:type="string">title %isolation%</data> + <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + <variation name="CreateProductReviewBackendEntityTestVariation2"> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="review/data/status_id" xsi:type="string">Pending</data> + <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/rating_0/rating" xsi:type="string">4</data> + <data name="review/data/nickname" xsi:type="string">Britney</data> + <data name="review/data/title" xsi:type="string">title %isolation%</data> + <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + <variation name="CreateProductReviewBackendEntityTestVariation3"> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="review/data/status_id" xsi:type="string">Not Approved</data> + <data name="review/data/select_stores/0" xsi:type="string">Main Website/Main Website Store/Default Store View</data> + <data name="review/data/ratings/rating_0/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/rating_0/rating" xsi:type="string">5</data> + <data name="review/data/nickname" xsi:type="string">Michael</data> + <data name="review/data/title" xsi:type="string">title %isolation%</data> + <data name="review/data/detail" xsi:type="string">review detail %isolation%</data> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewBackendSuccessSaveMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + </testCase> </config> -- GitLab From 3e7abab413caed48340a4a4b429094c3dc5acfd5 Mon Sep 17 00:00:00 2001 From: Vadim Zubovich <vadim_zubovich@epam.com> Date: Fri, 19 Jun 2015 12:27:45 +0300 Subject: [PATCH 321/396] MAGNSWTCH-139: PR stabilization - fixed phpdoc issues --- .../Catalog/Model/Resource/Product/Indexer/Eav/Source.php | 3 +-- app/code/Magento/CatalogSearch/Model/Resource/Engine.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) 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 8ed386a0bac..287847f4acf 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 @@ -28,8 +28,7 @@ class Source extends AbstractEav * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Catalog\Model\Resource\Helper $resourceHelper - * @param \Magento\Eav\Model\Attribute\FrontendType $frontendType - * @param null $resourcePrefix + * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, diff --git a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php index b72636f830e..8fb3a099d23 100644 --- a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php +++ b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php @@ -44,8 +44,7 @@ class Engine extends AbstractDb implements EngineInterface * @param \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility * @param Advanced $searchResource * @param \Magento\CatalogSearch\Helper\Data $catalogSearchData - * @param \Magento\Eav\Model\Attribute\FrontendType $frontendType - * @param null $resourcePrefix + * @param string|null $resourcePrefix */ public function __construct( \Magento\Framework\Model\Resource\Db\Context $context, -- GitLab From 727225f0e7563e5cb751a982576a9cdb76ca395d Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 19 Jun 2015 13:06:09 +0300 Subject: [PATCH 322/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index 6a5e9956024..bcfe39ee585 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -32,7 +32,29 @@ define([ } }); } + /** + * Initializes mixins assigned to a specfied component. + * + * @param {Object} mixins - object contains mixins list. + * @param {Object} itemContainer - object with component config and DOM element link. + */ + function initMixins(mixins, itemContainer){ + var configStack = {}, + element = itemContainer.el; + _.each(mixins, function (mixin, componentName) { + configStack = itemContainer.data[componentName]; + _.each(mixin, function (item) { + require([item], function (fn) { + configStack = fn(configStack, element); + }); + }); + itemContainer.data[componentName] = configStack; + }); + delete itemContainer.data.mixins; + + return itemContainer; + } /** * Parses elements 'data-mage-init' attribute as a valid JSON data. * Note: data-mage-init attribute will be removed. @@ -65,11 +87,16 @@ define([ _.toArray(nodes) .map(getData) .concat(virtuals) - .forEach(function (item) { - _.each(item.data, init.bind(null, item.el)); + .forEach(function (itemContainer) { + var mixins = itemContainer.data.mixins; + + if(mixins) { + $.when(itemContainer = initMixins(mixins, itemContainer)).then(_.each(itemContainer.data, init.bind(null, itemContainer.el))); + } else { + _.each(itemContainer.data, init.bind(null, itemContainer.el)); + } }); }, - applyFor: init }; }); -- GitLab From a2c0965515add513fc7324b0342d8a7ffb447493 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 19 Jun 2015 13:36:13 +0300 Subject: [PATCH 323/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index bcfe39ee585..c5fc39f9691 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -90,7 +90,7 @@ define([ .forEach(function (itemContainer) { var mixins = itemContainer.data.mixins; - if(mixins) { + if (mixins) { $.when(itemContainer = initMixins(mixins, itemContainer)).then(_.each(itemContainer.data, init.bind(null, itemContainer.el))); } else { _.each(itemContainer.data, init.bind(null, itemContainer.el)); -- GitLab From 8d1d6f472276241583c9f5582b9b260ed8ba9588 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 19 Jun 2015 14:19:50 +0300 Subject: [PATCH 324/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index c5fc39f9691..db0420db09d 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -44,10 +44,11 @@ define([ _.each(mixins, function (mixin, componentName) { configStack = itemContainer.data[componentName]; - _.each(mixin, function (item) { - require([item], function (fn) { - configStack = fn(configStack, element); - }); + require(mixin, function(){ + for (var i = 0, l = arguments.length; i < l; i++){ + configStack = arguments[i](configStack, element); + } + }); itemContainer.data[componentName] = configStack; }); -- GitLab From 100f7a6b3a78a1b357336358e8ac48e07fcb88b1 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Fri, 19 Jun 2015 14:42:26 +0300 Subject: [PATCH 325/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - fixed tests --- .../Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php | 2 +- .../Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 44335de6ff1..c32d11572cf 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 c74fa3e8fe4..0a1c7be6c95 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'); -- GitLab From 0489af9e45f4261e085693e3be97dc5631283d56 Mon Sep 17 00:00:00 2001 From: Dmytro Kvashnin <dkvashnin@ebay.com> Date: Tue, 9 Jun 2015 18:23:33 +0300 Subject: [PATCH 326/396] MAGETWO-32921: Adapt Payment\Gateway framework to client requirement - Added http client specialization - Generalized Payment Transparent infrastructure - Generalized Payment logger - Modified TMap not to use class reader --- app/code/Magento/Payment/Block/Info.php | 6 +- .../Payment/Block/Transparent/Form.php | 8 +- .../Payment/Block/Transparent/Iframe.php | 8 +- .../Payment/Gateway/Command/CommandPool.php | 16 ++- .../Gateway/Command/GatewayCommand.php | 63 +++++---- .../Gateway/Command/Result/ArrayResult.php | 34 +++++ .../Gateway/Command/ResultInterface.php | 16 +++ .../Payment/Gateway/CommandInterface.php | 2 +- .../Gateway/Config/ValueHandlerPool.php | 16 ++- .../Gateway/Data/AddressAdapterInterface.php | 2 +- .../Gateway/Data/Order/AddressAdapter.php | 4 +- .../Gateway/Data/Order/OrderAdapter.php | 20 +++ .../Gateway/Data/OrderAdapterInterface.php | 14 ++ .../Gateway/Data/Quote/AddressAdapter.php | 4 +- .../Gateway/Data/Quote/QuoteAdapter.php | 20 +++ .../Payment/Gateway/Http/Client/Zend.php | 28 +++- .../Http/Converter/HtmlFormConverter.php | 42 ++++++ .../Magento/Payment/Gateway/Http/Transfer.php | 123 ++++++++++++++++++ ...rface.php => TransferFactoryInterface.php} | 8 +- .../Gateway/Request/BuilderComposite.php | 16 ++- .../Payment/Gateway/Response/HandlerChain.php | 16 ++- .../Gateway/Validator/AbstractValidator.php | 35 +++++ .../Gateway/Validator/ValidatorComposite.php | 16 ++- .../Gateway/Validator/ValidatorPool.php | 16 ++- .../Payment/Model/IframeConfigProvider.php | 16 +++ .../Payment/Model/Method/AbstractMethod.php | 14 +- .../Magento/Payment/Model/Method/Logger.php | 55 ++++++-- .../Unit/Gateway/Command/CommandPoolTest.php | 33 ++++- .../Gateway/Command/GatewayCommandTest.php | 43 ++++-- .../Gateway/Config/ValueHandlerPoolTest.php | 39 ++++-- .../Gateway/Data/Order/AddressAdapterTest.php | 4 +- .../Gateway/Data/Quote/AddressAdapterTest.php | 4 +- .../Unit/Gateway/Http/Client/ZendTest.php | 13 +- .../Http/Converter/HtmlFormConverterTest.php | 57 ++++++++ .../Test/Unit/Gateway/Http/TransferTest.php | 37 ++++++ .../Gateway/Request/BuilderCompositeTest.php | 54 ++++++-- .../Gateway/Response/HandlerChainTest.php | 26 +++- .../Validator/ValidatorCompositeTest.php | 27 +++- .../Gateway/Validator/ValidatorPoolTest.php | 36 ++++- app/code/Magento/Payment/etc/payment.xml | 12 ++ .../templates/transparent/form.phtml | 1 + .../Payment/view/adminhtml/web/transparent.js | 10 +- .../templates/transparent/iframe.phtml | 11 ++ .../web/js/view/review/actions/iframe.js | 3 + .../web/template/review/actions/iframe.html | 3 +- .../Payment/view/frontend/web/transparent.js | 12 +- .../Magento/Quote/Api/Data/CartInterface.php | 17 +++ .../Quote/Model/BillingAddressManagement.php | 1 + app/code/Magento/Quote/Model/Quote.php | 16 ++- .../Magento/Quote/Model/Quote/Payment.php | 4 +- .../Test/Unit/Model/QuoteRepositoryTest.php | 18 +-- .../Sales/Api/Data/OrderAddressInterface.php | 7 + .../Magento/Test/Integrity/ClassesTest.php | 26 ++-- .../Magento/Test/Integrity/ConfigTest.php | 16 ++- .../Framework/Intl/DateTimeFactory.php | 25 ++++ lib/internal/Magento/Framework/Intl/README.md | 3 + .../Magento/Framework/ObjectManager/TMap.php | 16 +-- .../ObjectManager/Test/Unit/TMapTest.php | 17 --- .../Framework/View/Element/Template.php | 1 - 59 files changed, 1015 insertions(+), 195 deletions(-) create mode 100644 app/code/Magento/Payment/Gateway/Command/Result/ArrayResult.php create mode 100644 app/code/Magento/Payment/Gateway/Command/ResultInterface.php create mode 100644 app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php create mode 100644 app/code/Magento/Payment/Gateway/Http/Transfer.php rename app/code/Magento/Payment/Gateway/Http/{TransferBuilderInterface.php => TransferFactoryInterface.php} (59%) create mode 100644 app/code/Magento/Payment/Gateway/Validator/AbstractValidator.php create mode 100644 app/code/Magento/Payment/Test/Unit/Gateway/Http/Converter/HtmlFormConverterTest.php create mode 100644 app/code/Magento/Payment/Test/Unit/Gateway/Http/TransferTest.php create mode 100644 lib/internal/Magento/Framework/Intl/DateTimeFactory.php create mode 100644 lib/internal/Magento/Framework/Intl/README.md diff --git a/app/code/Magento/Payment/Block/Info.php b/app/code/Magento/Payment/Block/Info.php index d56f2c61fe3..94c8b8c998d 100644 --- a/app/code/Magento/Payment/Block/Info.php +++ b/app/code/Magento/Payment/Block/Info.php @@ -15,7 +15,7 @@ class Info extends \Magento\Framework\View\Element\Template * * @var \Magento\Framework\Object */ - protected $_paymentSpecificInformation = null; + protected $_paymentSpecificInformation; /** * @var string @@ -152,10 +152,6 @@ class Info extends \Magento\Framework\View\Element\Template } elseif (is_array($transport)) { $transport = new \Magento\Framework\Object($transport); } - $this->_eventManager->dispatch( - 'payment_info_block_prepare_specific_information', - ['transport' => $transport, 'payment' => $this->getInfo(), 'block' => $this] - ); $this->_paymentSpecificInformation = $transport; } return $this->_paymentSpecificInformation; diff --git a/app/code/Magento/Payment/Block/Transparent/Form.php b/app/code/Magento/Payment/Block/Transparent/Form.php index 73df0c39c87..3232776c730 100644 --- a/app/code/Magento/Payment/Block/Transparent/Form.php +++ b/app/code/Magento/Payment/Block/Transparent/Form.php @@ -6,6 +6,7 @@ namespace Magento\Payment\Block\Transparent; use Magento\Framework\Exception\LocalizedException; +use Magento\Payment\Model\Method\Adapter; use Magento\Payment\Model\Method\TransparentInterface; use Magento\Checkout\Model\Session; use Magento\Payment\Model\Config; @@ -168,7 +169,10 @@ class Form extends \Magento\Payment\Block\Form\Cc */ public function getMethodConfigData($fieldName) { - return $this->getMethod()->getConfigInterface()->getValue($fieldName); + if ($this->getMethod() instanceof TransparentInterface) { + return $this->getMethod()->getConfigInterface()->getValue($fieldName); + } + return $this->getMethod()->getConfigData($fieldName); } /** @@ -181,7 +185,7 @@ class Form extends \Magento\Payment\Block\Form\Cc { $method = parent::getMethod(); - if (!$method instanceof TransparentInterface) { + if (!$method instanceof TransparentInterface && !$method instanceof Adapter) { throw new LocalizedException( __('We cannot retrieve the transparent payment method model object.') ); diff --git a/app/code/Magento/Payment/Block/Transparent/Iframe.php b/app/code/Magento/Payment/Block/Transparent/Iframe.php index 3070173f92b..d93f0d076ab 100644 --- a/app/code/Magento/Payment/Block/Transparent/Iframe.php +++ b/app/code/Magento/Payment/Block/Transparent/Iframe.php @@ -12,6 +12,8 @@ namespace Magento\Payment\Block\Transparent; */ class Iframe extends \Magento\Framework\View\Element\Template { + const REGISTRY_KEY = 'transparent_form_params'; + /** * Core registry * @@ -42,10 +44,8 @@ class Iframe extends \Magento\Framework\View\Element\Template */ protected function _prepareLayout() { - if ($this->hasRegistryKey()) { - $params = $this->coreRegistry->registry($this->getRegistryKey()); - $this->setParams($params); - } + $params = $this->coreRegistry->registry(self::REGISTRY_KEY); + $this->setParams($params); return parent::_prepareLayout(); } } diff --git a/app/code/Magento/Payment/Gateway/Command/CommandPool.php b/app/code/Magento/Payment/Gateway/Command/CommandPool.php index a6cafee447b..6b1014d5aa7 100644 --- a/app/code/Magento/Payment/Gateway/Command/CommandPool.php +++ b/app/code/Magento/Payment/Gateway/Command/CommandPool.php @@ -8,21 +8,29 @@ namespace Magento\Payment\Gateway\Command; use Magento\Framework\ObjectManager\TMap; use Magento\Payment\Gateway\CommandInterface; use Magento\Framework\Exception\NotFoundException; +use Magento\Framework\ObjectManager\TMapFactory; class CommandPool implements CommandPoolInterface { /** - * @var CommandInterface[] + * @var CommandInterface[] | TMap */ private $commands; /** - * @param TMap $commands + * @param array $commands + * @param TMapFactory $tmapFactory */ public function __construct( - TMap $commands + array $commands, + TMapFactory $tmapFactory ) { - $this->commands = $commands; + $this->commands = $tmapFactory->create( + [ + 'array' => $commands, + 'type' => 'Magento\Payment\Gateway\CommandInterface' + ] + ); } /** diff --git a/app/code/Magento/Payment/Gateway/Command/GatewayCommand.php b/app/code/Magento/Payment/Gateway/Command/GatewayCommand.php index e2f5e25f75b..a6044462cde 100644 --- a/app/code/Magento/Payment/Gateway/Command/GatewayCommand.php +++ b/app/code/Magento/Payment/Gateway/Command/GatewayCommand.php @@ -7,66 +7,83 @@ namespace Magento\Payment\Gateway\Command; use Magento\Payment\Gateway\CommandInterface; use Magento\Payment\Gateway\Http\ClientInterface; +use Magento\Payment\Gateway\Http\TransferFactoryInterface; use Magento\Payment\Gateway\Request; +use Magento\Payment\Gateway\Request\BuilderInterface; use Magento\Payment\Gateway\Response; +use Magento\Payment\Gateway\Response\HandlerInterface; +use Magento\Payment\Gateway\Validator\ValidatorInterface; class GatewayCommand implements CommandInterface { /** - * @var \Magento\Payment\Gateway\Request\BuilderInterface + * @var BuilderInterface */ private $requestBuilder; /** - * @var \Magento\Payment\Gateway\Http\TransferBuilderInterface + * @var TransferFactoryInterface */ - private $transferBuilder; + private $transferFactory; /** - * @var \Magento\Payment\Gateway\Http\ClientInterface + * @var ClientInterface */ - private $gateway; + private $client; /** - * @var \Magento\Payment\Gateway\Response\HandlerInterface + * @var HandlerInterface */ - private $responseHandler; + private $handler; /** - * @param \Magento\Payment\Gateway\Request\BuilderInterface $requestBuilder - * @param \Magento\Payment\Gateway\Http\TransferBuilderInterface $transferBuilder - * @param \Magento\Payment\Gateway\Http\ClientInterface $gateway - * @param \Magento\Payment\Gateway\Response\HandlerInterface $responseHandler + * @var ValidatorInterface + */ + private $validator; + + /** + * @param BuilderInterface $requestBuilder + * @param TransferFactoryInterface $transferFactory + * @param ClientInterface $client + * @param HandlerInterface $handler + * @param ValidatorInterface $validator */ public function __construct( - \Magento\Payment\Gateway\Request\BuilderInterface $requestBuilder, - \Magento\Payment\Gateway\Http\TransferBuilderInterface $transferBuilder, - ClientInterface $gateway, - \Magento\Payment\Gateway\Response\HandlerInterface $responseHandler + BuilderInterface $requestBuilder, + TransferFactoryInterface $transferFactory, + ClientInterface $client, + HandlerInterface $handler, + ValidatorInterface $validator ) { - $this->requestBuilder = $requestBuilder; - $this->transferBuilder = $transferBuilder; - $this->gateway = $gateway; - $this->responseHandler = $responseHandler; + $this->transferFactory = $transferFactory; + $this->client = $client; + $this->handler = $handler; + $this->validator = $validator; } /** * Executes command basing on business object * * @param array $commandSubject - * @return void + * @return null */ public function execute(array $commandSubject) { // @TODO implement exceptions catching - $transferO = $this->transferBuilder->build( + $transferO = $this->transferFactory->create( $this->requestBuilder->build($commandSubject) ); - $response = $this->gateway->placeRequest($transferO); + $response = $this->client->placeRequest($transferO); + + $result = $this->validator->validate(array_merge($commandSubject, ['response' => $response])); + if ($result !== null && !$result->isValid()) { + $commandSubject['payment']->getPayment()->setIsTransactionPending(true); + return; + } - $this->responseHandler->handle( + $this->handler->handle( $commandSubject, $response ); diff --git a/app/code/Magento/Payment/Gateway/Command/Result/ArrayResult.php b/app/code/Magento/Payment/Gateway/Command/Result/ArrayResult.php new file mode 100644 index 00000000000..fff6c1dc012 --- /dev/null +++ b/app/code/Magento/Payment/Gateway/Command/Result/ArrayResult.php @@ -0,0 +1,34 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Payment\Gateway\Command\Result; + +use Magento\Payment\Gateway\Command\ResultInterface; + +class ArrayResult implements ResultInterface +{ + /** + * @var array + */ + private $array; + + /** + * @param array $array + */ + public function __construct(array $array = []) + { + $this->array = $array; + } + + /** + * Returns result interpretation + * + * @return array + */ + public function get() + { + return $this->array; + } +} diff --git a/app/code/Magento/Payment/Gateway/Command/ResultInterface.php b/app/code/Magento/Payment/Gateway/Command/ResultInterface.php new file mode 100644 index 00000000000..bf26fc8e872 --- /dev/null +++ b/app/code/Magento/Payment/Gateway/Command/ResultInterface.php @@ -0,0 +1,16 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Payment\Gateway\Command; + +interface ResultInterface +{ + /** + * Returns result interpretation + * + * @return mixed + */ + public function get(); +} diff --git a/app/code/Magento/Payment/Gateway/CommandInterface.php b/app/code/Magento/Payment/Gateway/CommandInterface.php index 1537c4d21a8..44ef0ee10cf 100644 --- a/app/code/Magento/Payment/Gateway/CommandInterface.php +++ b/app/code/Magento/Payment/Gateway/CommandInterface.php @@ -11,7 +11,7 @@ interface CommandInterface * Executes command basing on business object * * @param array $commandSubject - * @return void + * @return null|Command\ResultInterface */ public function execute(array $commandSubject); } diff --git a/app/code/Magento/Payment/Gateway/Config/ValueHandlerPool.php b/app/code/Magento/Payment/Gateway/Config/ValueHandlerPool.php index ec00f81b180..0364336a2ea 100644 --- a/app/code/Magento/Payment/Gateway/Config/ValueHandlerPool.php +++ b/app/code/Magento/Payment/Gateway/Config/ValueHandlerPool.php @@ -6,6 +6,7 @@ namespace Magento\Payment\Gateway\Config; use Magento\Framework\ObjectManager\TMap; +use Magento\Framework\ObjectManager\TMapFactory; class ValueHandlerPool implements \Magento\Payment\Gateway\Config\ValueHandlerPoolInterface { @@ -15,21 +16,28 @@ class ValueHandlerPool implements \Magento\Payment\Gateway\Config\ValueHandlerPo const DEFAULT_HANDLER = 'default'; /** - * @var ValueHandlerInterface[] + * @var ValueHandlerInterface[] | TMap */ private $handlers; /** - * @param TMap $handlers + * @param array $handlers + * @param TMapFactory $tmapFactory */ public function __construct( - TMap $handlers + array $handlers, + TMapFactory $tmapFactory ) { if (!isset($handlers[self::DEFAULT_HANDLER])) { throw new \LogicException('Default handler should be provided.'); } - $this->handlers = $handlers; + $this->handlers = $tmapFactory->create( + [ + 'array' => $handlers, + 'type' => 'Magento\Payment\Gateway\Config\ValueHandlerInterface' + ] + ); } /** diff --git a/app/code/Magento/Payment/Gateway/Data/AddressAdapterInterface.php b/app/code/Magento/Payment/Gateway/Data/AddressAdapterInterface.php index aeb1f0432f4..ef55a1a6738 100644 --- a/app/code/Magento/Payment/Gateway/Data/AddressAdapterInterface.php +++ b/app/code/Magento/Payment/Gateway/Data/AddressAdapterInterface.php @@ -12,7 +12,7 @@ interface AddressAdapterInterface * * @return string */ - public function getRegion(); + public function getRegionCode(); /** * Get country id diff --git a/app/code/Magento/Payment/Gateway/Data/Order/AddressAdapter.php b/app/code/Magento/Payment/Gateway/Data/Order/AddressAdapter.php index 54f312ccb5a..b057d911824 100644 --- a/app/code/Magento/Payment/Gateway/Data/Order/AddressAdapter.php +++ b/app/code/Magento/Payment/Gateway/Data/Order/AddressAdapter.php @@ -28,9 +28,9 @@ class AddressAdapter implements AddressAdapterInterface * * @return string */ - public function getRegion() + public function getRegionCode() { - return $this->address->getRegion(); + return $this->address->getRegionCode(); } /** diff --git a/app/code/Magento/Payment/Gateway/Data/Order/OrderAdapter.php b/app/code/Magento/Payment/Gateway/Data/Order/OrderAdapter.php index 08ad153f611..f01bee1d7c7 100644 --- a/app/code/Magento/Payment/Gateway/Data/Order/OrderAdapter.php +++ b/app/code/Magento/Payment/Gateway/Data/Order/OrderAdapter.php @@ -86,4 +86,24 @@ class OrderAdapter implements OrderAdapterInterface ['address' => $this->order->getShippingAddress()] ); } + + /** + * Returns order store id + * + * @return int + */ + public function getStoreId() + { + return $this->order->getStoreId(); + } + + /** + * Returns order id + * + * @return int + */ + public function getId() + { + return $this->order->getEntityId(); + } } diff --git a/app/code/Magento/Payment/Gateway/Data/OrderAdapterInterface.php b/app/code/Magento/Payment/Gateway/Data/OrderAdapterInterface.php index 60698aa7d94..0d925d823a9 100644 --- a/app/code/Magento/Payment/Gateway/Data/OrderAdapterInterface.php +++ b/app/code/Magento/Payment/Gateway/Data/OrderAdapterInterface.php @@ -41,4 +41,18 @@ interface OrderAdapterInterface * @return AddressAdapterInterface */ public function getShippingAddress(); + + /** + * Returns order store id + * + * @return int + */ + public function getStoreId(); + + /** + * Returns order id + * + * @return int + */ + public function getId(); } diff --git a/app/code/Magento/Payment/Gateway/Data/Quote/AddressAdapter.php b/app/code/Magento/Payment/Gateway/Data/Quote/AddressAdapter.php index dd846efe7a7..b73f2bb7bcd 100644 --- a/app/code/Magento/Payment/Gateway/Data/Quote/AddressAdapter.php +++ b/app/code/Magento/Payment/Gateway/Data/Quote/AddressAdapter.php @@ -28,9 +28,9 @@ class AddressAdapter implements AddressAdapterInterface * * @return string */ - public function getRegion() + public function getRegionCode() { - return $this->address->getRegion(); + return $this->address->getRegionCode(); } /** diff --git a/app/code/Magento/Payment/Gateway/Data/Quote/QuoteAdapter.php b/app/code/Magento/Payment/Gateway/Data/Quote/QuoteAdapter.php index b6ed86aa585..43a6a9ded86 100644 --- a/app/code/Magento/Payment/Gateway/Data/Quote/QuoteAdapter.php +++ b/app/code/Magento/Payment/Gateway/Data/Quote/QuoteAdapter.php @@ -86,4 +86,24 @@ class QuoteAdapter implements OrderAdapterInterface ['address' => $this->quote->getShippingAddress()] ); } + + /** + * Returns order store id + * + * @return int + */ + public function getStoreId() + { + return $this->quote->getStoreId(); + } + + /** + * Returns order id + * + * @return int + */ + public function getId() + { + return $this->quote->getId(); + } } diff --git a/app/code/Magento/Payment/Gateway/Http/Client/Zend.php b/app/code/Magento/Payment/Gateway/Http/Client/Zend.php index fb3b64434c6..0ea8ffbc871 100644 --- a/app/code/Magento/Payment/Gateway/Http/Client/Zend.php +++ b/app/code/Magento/Payment/Gateway/Http/Client/Zend.php @@ -8,6 +8,8 @@ namespace Magento\Payment\Gateway\Http\Client; use Magento\Framework\HTTP\ZendClientFactory; use Magento\Framework\HTTP\ZendClient; use Magento\Payment\Gateway\Http\ClientInterface; +use Magento\Payment\Gateway\Http\ConverterInterface; +use Magento\Payment\Model\Method\Logger; class Zend implements ClientInterface { @@ -17,20 +19,28 @@ class Zend implements ClientInterface private $clientFactory; /** - * @var \Magento\Payment\Gateway\Http\ConverterInterface + * @var ConverterInterface */ private $converter; + /** + * @var Logger + */ + private $logger; + /** * @param ZendClientFactory $clientFactory - * @param \Magento\Payment\Gateway\Http\ConverterInterface $converter + * @param ConverterInterface $converter + * @param Logger $logger */ public function __construct( ZendClientFactory $clientFactory, - \Magento\Payment\Gateway\Http\ConverterInterface $converter + ConverterInterface $converter, + Logger $logger ) { $this->clientFactory = $clientFactory; $this->converter = $converter; + $this->logger = $logger; } /** @@ -38,6 +48,10 @@ class Zend implements ClientInterface */ public function placeRequest(\Magento\Payment\Gateway\Http\TransferInterface $transferObject) { + $log = [ + 'request' => $transferObject->getBody() + ]; + $result = []; /** @var ZendClient $client */ $client = $this->clientFactory->create(); @@ -61,11 +75,17 @@ class Zend implements ClientInterface try { $response = $client->request(); - return $this->converter->convert($response->getBody()); + + $result = $this->converter->convert($response->getBody()); + $log['response'] = $result; } catch (\Zend_Http_Client_Exception $e) { throw new \Magento\Payment\Gateway\Http\ClientException(__($e->getMessage())); } catch (\Magento\Payment\Gateway\Http\ConverterException $e) { throw $e; + } finally { + $this->logger->debug($log); } + + return $result; } } diff --git a/app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php b/app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php new file mode 100644 index 00000000000..c345aeed1dd --- /dev/null +++ b/app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php @@ -0,0 +1,42 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Payment\Gateway\Http\Converter; + +use Magento\Payment\Gateway\Http\ConverterException; +use Magento\Payment\Gateway\Http\ConverterInterface; + +class HtmlFormConverter implements ConverterInterface +{ + /** + * Converts gateway response to ENV structure + * + * @param string $response + * @return array + * @throws ConverterException + */ + public function convert($response) + { + $document = new \DOMDocument(); + if (!$document->loadHTML($response)) { + throw new ConverterException(__('Wrong gateway response format.')); + } + $document->getElementsByTagName('input'); + + $convertedResponse = []; + /** @var \DOMNode $inputNode */ + foreach ($document->getElementsByTagName('input') as $inputNode) { + if (!$inputNode->attributes->getNamedItem('value') + || !$inputNode->attributes->getNamedItem('name') + ) { + continue; + } + $convertedResponse[$inputNode->attributes->getNamedItem('name')->nodeValue] + = $inputNode->attributes->getNamedItem('value')->nodeValue; + } + + return $convertedResponse; + } +} diff --git a/app/code/Magento/Payment/Gateway/Http/Transfer.php b/app/code/Magento/Payment/Gateway/Http/Transfer.php new file mode 100644 index 00000000000..6084f9f1c46 --- /dev/null +++ b/app/code/Magento/Payment/Gateway/Http/Transfer.php @@ -0,0 +1,123 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Payment\Gateway\Http; + +class Transfer implements TransferInterface +{ + /** + * @var array + */ + private $clientConfig; + + /** + * @var array + */ + private $headers; + + /** + * @var string + */ + private $method; + + /** + * @var array + */ + private $body; + + /** + * @var string + */ + private $uri; + + /** + * @var bool + */ + private $encode; + + /** + * @param array $clientConfig + * @param array $headers + * @param array $body + * @param string $method + * @param string $uri + * @param bool $encode + */ + public function __construct( + array $clientConfig, + array $headers, + array $body, + $method, + $uri, + $encode = false + ) { + $this->clientConfig = $clientConfig; + $this->headers = $headers; + $this->method = $method; + $this->body = $body; + $this->uri = $uri; + $this->encode = $encode; + } + + /** + * Returns gateway client configuration + * + * @return array + */ + public function getClientConfig() + { + return $this->clientConfig; + } + + /** + * Returns method used to place request + * + * @return string|int + */ + public function getMethod() + { + return (string)$this->method; + } + + /** + * Returns headers + * + * @return array + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * Whether body should be encoded before place + * + * @return bool + */ + public function shouldEncode() + { + return (bool)$this->encode; + } + + /** + * Returns request body + * + * @return array + */ + public function getBody() + { + return $this->body; + } + + /** + * Returns URI + * + * @return string + */ + public function getUri() + { + return (string)$this->uri; + } +} diff --git a/app/code/Magento/Payment/Gateway/Http/TransferBuilderInterface.php b/app/code/Magento/Payment/Gateway/Http/TransferFactoryInterface.php similarity index 59% rename from app/code/Magento/Payment/Gateway/Http/TransferBuilderInterface.php rename to app/code/Magento/Payment/Gateway/Http/TransferFactoryInterface.php index b1a98abfa9a..8a36ba9d1ca 100644 --- a/app/code/Magento/Payment/Gateway/Http/TransferBuilderInterface.php +++ b/app/code/Magento/Payment/Gateway/Http/TransferFactoryInterface.php @@ -5,15 +5,13 @@ */ namespace Magento\Payment\Gateway\Http; -use Magento\Payment\Gateway\Http\TransferInterface; - -interface TransferBuilderInterface +interface TransferFactoryInterface { /** * Builds gateway transfer object * - * @param array $requestENV + * @param array $request * @return TransferInterface */ - public function build(array $requestENV); + public function create(array $request); } diff --git a/app/code/Magento/Payment/Gateway/Request/BuilderComposite.php b/app/code/Magento/Payment/Gateway/Request/BuilderComposite.php index 33e7df31315..74395ff812d 100644 --- a/app/code/Magento/Payment/Gateway/Request/BuilderComposite.php +++ b/app/code/Magento/Payment/Gateway/Request/BuilderComposite.php @@ -6,21 +6,29 @@ namespace Magento\Payment\Gateway\Request; use Magento\Framework\ObjectManager\TMap; +use Magento\Framework\ObjectManager\TMapFactory; class BuilderComposite implements BuilderInterface { /** - * @var BuilderInterface[] + * @var BuilderInterface[] | TMap */ private $builders; /** - * @param TMap $builders + * @param array $builders + * @param TMapFactory $tmapFactory */ public function __construct( - TMap $builders + array $builders, + TMapFactory $tmapFactory ) { - $this->builders = $builders; + $this->builders = $tmapFactory->create( + [ + 'array' => $builders, + 'type' => 'Magento\Payment\Gateway\Request\BuilderInterface' + ] + ); } /** diff --git a/app/code/Magento/Payment/Gateway/Response/HandlerChain.php b/app/code/Magento/Payment/Gateway/Response/HandlerChain.php index 91205ccc844..1425514e7e3 100644 --- a/app/code/Magento/Payment/Gateway/Response/HandlerChain.php +++ b/app/code/Magento/Payment/Gateway/Response/HandlerChain.php @@ -6,21 +6,29 @@ namespace Magento\Payment\Gateway\Response; use Magento\Framework\ObjectManager\TMap; +use Magento\Framework\ObjectManager\TMapFactory; class HandlerChain implements HandlerInterface { /** - * @var HandlerInterface[] + * @var HandlerInterface[] | TMap */ private $handlers; /** - * @param TMap $handlers + * @param array $handlers + * @param TMapFactory $tmapFactory */ public function __construct( - TMap $handlers + array $handlers, + TMapFactory $tmapFactory ) { - $this->handlers = $handlers; + $this->handlers = $tmapFactory->create( + [ + 'array' => $handlers, + 'type' => 'Magento\Payment\Gateway\Response\HandlerInterface' + ] + ); } /** diff --git a/app/code/Magento/Payment/Gateway/Validator/AbstractValidator.php b/app/code/Magento/Payment/Gateway/Validator/AbstractValidator.php new file mode 100644 index 00000000000..e82e0605445 --- /dev/null +++ b/app/code/Magento/Payment/Gateway/Validator/AbstractValidator.php @@ -0,0 +1,35 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Payment\Gateway\Validator; + +abstract class AbstractValidator implements ValidatorInterface +{ + /** + * @var ResultInterfaceFactory + */ + private $resultInterfaceFactory; + + /** + * @param ResultInterfaceFactory $resultFactory + */ + public function __construct( + ResultInterfaceFactory $resultFactory + ) { + $this->resultInterfaceFactory = $resultFactory; + } + + /** + * Factory method + * + * @param bool $isValid + * @param array $fails + * @return ResultInterface + */ + protected function createResult($isValid, array $fails = []) + { + return $this->resultInterfaceFactory->create(['isValid' => (bool)$isValid, 'failsDescription' => $fails]); + } +} diff --git a/app/code/Magento/Payment/Gateway/Validator/ValidatorComposite.php b/app/code/Magento/Payment/Gateway/Validator/ValidatorComposite.php index 6ee690a2500..05a476f9743 100644 --- a/app/code/Magento/Payment/Gateway/Validator/ValidatorComposite.php +++ b/app/code/Magento/Payment/Gateway/Validator/ValidatorComposite.php @@ -6,12 +6,13 @@ namespace Magento\Payment\Gateway\Validator; use Magento\Framework\ObjectManager\TMap; +use Magento\Framework\ObjectManager\TMapFactory; use Magento\Payment\Gateway\Validator\ResultInterfaceFactory; class ValidatorComposite implements ValidatorInterface { /** - * @var ValidatorInterface[] + * @var ValidatorInterface[] | TMap */ private $validators; @@ -22,13 +23,20 @@ class ValidatorComposite implements ValidatorInterface /** * @param ResultInterfaceFactory $resultFactory - * @param TMap $validators + * @param array $validators + * @param TMapFactory $tmapFactory */ public function __construct( ResultInterfaceFactory $resultFactory, - TMap $validators + array $validators, + TMapFactory $tmapFactory ) { - $this->validators = $validators; + $this->validators = $tmapFactory->create( + [ + 'array' => $validators, + 'type' => 'Magento\Payment\Gateway\Validator\ValidatorInterface' + ] + ); $this->resultFactory = $resultFactory; } diff --git a/app/code/Magento/Payment/Gateway/Validator/ValidatorPool.php b/app/code/Magento/Payment/Gateway/Validator/ValidatorPool.php index c2f2b347de8..e2b746ea733 100644 --- a/app/code/Magento/Payment/Gateway/Validator/ValidatorPool.php +++ b/app/code/Magento/Payment/Gateway/Validator/ValidatorPool.php @@ -7,21 +7,29 @@ namespace Magento\Payment\Gateway\Validator; use Magento\Framework\Exception\NotFoundException; use Magento\Framework\ObjectManager\TMap; +use Magento\Framework\ObjectManager\TMapFactory; class ValidatorPool implements \Magento\Payment\Gateway\Validator\ValidatorPoolInterface { /** - * @var ValidatorInterface[] + * @var ValidatorInterface[] | TMap */ private $validators; /** - * @param TMap $validators + * @param array $validators + * @param TMapFactory $tmapFactory */ public function __construct( - TMap $validators + array $validators, + TMapFactory $tmapFactory ) { - $this->validators = $validators; + $this->validators = $tmapFactory->create( + [ + 'array' => $validators, + 'type' => 'Magento\Payment\Gateway\Validator\ValidatorInterface' + ] + ); } /** diff --git a/app/code/Magento/Payment/Model/IframeConfigProvider.php b/app/code/Magento/Payment/Model/IframeConfigProvider.php index a3a48f64f62..03520b7b908 100644 --- a/app/code/Magento/Payment/Model/IframeConfigProvider.php +++ b/app/code/Magento/Payment/Model/IframeConfigProvider.php @@ -21,6 +21,11 @@ use Psr\Log\LoggerInterface; */ class IframeConfigProvider implements ConfigProviderInterface { + /** + * Default length of Cc year field + */ + const DEFAULT_YEAR_LENGTH = 2; + /** * @var Repository */ @@ -92,6 +97,7 @@ class IframeConfigProvider implements ConfigProviderInterface 'cgiUrl' => [$this->methodCode => $this->getCgiUrl()], 'placeOrderUrl' => [$this->methodCode => $this->getPlaceOrderUrl()], 'saveOrderUrl' => [$this->methodCode => $this->getSaveOrderUrl()], + 'expireYearLength' => [$this->methodCode => $this->getExpireDateYearLength()] ] ] ]; @@ -115,6 +121,16 @@ class IframeConfigProvider implements ConfigProviderInterface return $result; } + /** + * Returns Cc expire year length + * + * @return int + */ + protected function getExpireDateYearLength() + { + return (int)$this->getMethodConfigData('cc_year_length') ?: self::DEFAULT_YEAR_LENGTH; + } + /** * Get map of cc_code, cc_num, cc_expdate for gateway * Returns json formatted string diff --git a/app/code/Magento/Payment/Model/Method/AbstractMethod.php b/app/code/Magento/Payment/Model/Method/AbstractMethod.php index c9bc85c757d..441547499d8 100644 --- a/app/code/Magento/Payment/Model/Method/AbstractMethod.php +++ b/app/code/Magento/Payment/Model/Method/AbstractMethod.php @@ -586,6 +586,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function order(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -603,6 +604,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function authorize(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -620,6 +622,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function capture(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -638,6 +641,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function refund(\Magento\Payment\Model\InfoInterface $payment, $amount) { @@ -653,6 +657,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @param \Magento\Framework\Object|InfoInterface $payment * @return $this * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function cancel(\Magento\Payment\Model\InfoInterface $payment) { @@ -666,6 +671,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function void(\Magento\Payment\Model\InfoInterface $payment) { @@ -692,6 +698,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return false * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function acceptPayment(InfoInterface $payment) { @@ -708,6 +715,7 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl * @return false * @throws \Magento\Framework\Exception\LocalizedException * @api + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function denyPayment(InfoInterface $payment) { @@ -833,7 +841,11 @@ abstract class AbstractMethod extends \Magento\Framework\Model\AbstractExtensibl */ protected function _debug($debugData) { - $this->logger->debug($debugData, $this->getDebugReplacePrivateDataKeys(), $this->getDebugFlag()); + $this->logger->debug( + $debugData, + $this->getDebugReplacePrivateDataKeys(), + $this->getDebugFlag() + ); } /** diff --git a/app/code/Magento/Payment/Model/Method/Logger.php b/app/code/Magento/Payment/Model/Method/Logger.php index 107de086bb9..7e7331b77df 100644 --- a/app/code/Magento/Payment/Model/Method/Logger.php +++ b/app/code/Magento/Payment/Model/Method/Logger.php @@ -15,38 +15,73 @@ use Psr\Log\LoggerInterface; class Logger { const DEBUG_KEYS_MASK = '****'; + /** * @var LoggerInterface */ protected $logger; + /** + * @var \Magento\Payment\Gateway\ConfigInterface + */ + private $config; + /** * @param LoggerInterface $logger + * @param \Magento\Payment\Gateway\ConfigInterface $config */ - public function __construct(LoggerInterface $logger) - { + public function __construct( + LoggerInterface $logger, + \Magento\Payment\Gateway\ConfigInterface $config = null + ) { $this->logger = $logger; + $this->config = $config; } /** * Logs payment related information used for debug * * @param array $debugData - * @param array $debugReplaceKeys - * @param bool $debugFlag + * @param array|null $debugReplaceKeys + * @param bool|null $debugFlag * @return void */ - public function debug(array $debugData, array $debugReplaceKeys, $debugFlag) + public function debug(array $debugData, array $debugReplaceKeys = null, $debugFlag = null) { - if ($debugFlag == true && !empty($debugData) && !empty($debugReplaceKeys)) { - $debugData = $this->filterDebugData( - $debugData, - $debugReplaceKeys - ); + $debugReplaceKeys = $debugReplaceKeys !== null ? $debugReplaceKeys : $this->getDebugReplaceFields(); + $debugFlag = $debugFlag !== null ? $debugFlag : $this->isDebugOn(); + if ($debugFlag === true && !empty($debugData) && !empty($debugReplaceKeys)) { + $debugData = $this->filterDebugData( + $debugData, + $debugReplaceKeys + ); $this->logger->debug(var_export($debugData, true)); } } + /** + * Returns configured keys to be replaced with mask + * + * @return array + */ + private function getDebugReplaceFields() + { + if ($this->config->getValue('debugReplaceKeys')) { + return explode(',', $this->config->getValue('debugReplaceKeys')); + } + return []; + } + + /** + * Whether debug is enabled in configuration + * + * @return bool + */ + private function isDebugOn() + { + return (bool)$this->config->getValue('debug'); + } + /** * Recursive filter data by private conventions * diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Command/CommandPoolTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Command/CommandPoolTest.php index e39384caf78..92394d8bb33 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Command/CommandPoolTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Command/CommandPoolTest.php @@ -13,9 +13,23 @@ class CommandPoolTest extends \PHPUnit_Framework_TestCase { $commandI = $this->getMockBuilder('Magento\Payment\Gateway\CommandInterface') ->getMockForAbstractClass(); + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => ['Magento\Payment\Gateway\CommandInterface'], + 'type' => 'Magento\Payment\Gateway\CommandInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('offsetExists') ->with('command') @@ -25,7 +39,7 @@ class CommandPoolTest extends \PHPUnit_Framework_TestCase ->with('command') ->willReturn($commandI); - $pool = new CommandPool($tMap); + $pool = new CommandPool(['Magento\Payment\Gateway\CommandInterface'], $tMapFactory); static::assertSame($commandI, $pool->get('command')); } @@ -33,15 +47,30 @@ class CommandPoolTest extends \PHPUnit_Framework_TestCase public function testGetException() { $this->setExpectedException('Magento\Framework\Exception\NotFoundException'); + + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [], + 'type' => 'Magento\Payment\Gateway\CommandInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('offsetExists') ->with('command') ->willReturn(false); - $pool = new CommandPool($tMap); + $pool = new CommandPool([], $tMapFactory); $pool->get('command'); } } diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Command/GatewayCommandTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Command/GatewayCommandTest.php index 849138ac081..9872e20250b 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Command/GatewayCommandTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Command/GatewayCommandTest.php @@ -16,36 +16,44 @@ class GatewayCommandTest extends \PHPUnit_Framework_TestCase protected $requestBuilderMock; /** - * @var \Magento\Payment\Gateway\Http\TransferBuilderInterface|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Payment\Gateway\Http\TransferFactoryInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $transferBuilderMock; + protected $transferFactoryMock; /** * @var \Magento\Payment\Gateway\Http\ClientInterface|\PHPUnit_Framework_MockObject_MockObject */ - protected $gatewayMock; + protected $clientMock; /** * @var \Magento\Payment\Gateway\Response\HandlerInterface|\PHPUnit_Framework_MockObject_MockObject */ protected $responseHandlerMock; + /** + * @var \Magento\Payment\Gateway\Validator\ValidatorInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $validatorMock; + protected function setUp() { $this->requestBuilderMock = $this->getMockBuilder('Magento\Payment\Gateway\Request\BuilderInterface') ->getMockForAbstractClass(); - $this->transferBuilderMock = $this->getMockBuilder('Magento\Payment\Gateway\Http\TransferBuilderInterface') + $this->transferFactoryMock = $this->getMockBuilder('Magento\Payment\Gateway\Http\TransferFactoryInterface') ->getMockForAbstractClass(); - $this->gatewayMock = $this->getMockBuilder('Magento\Payment\Gateway\Http\ClientInterface') + $this->clientMock = $this->getMockBuilder('Magento\Payment\Gateway\Http\ClientInterface') ->getMockForAbstractClass(); $this->responseHandlerMock = $this->getMockBuilder('Magento\Payment\Gateway\Response\HandlerInterface') ->getMockForAbstractClass(); + $this->validatorMock = $this->getMockBuilder('Magento\Payment\Gateway\Validator\ValidatorInterface') + ->getMockForAbstractClass(); $this->model = new \Magento\Payment\Gateway\Command\GatewayCommand( $this->requestBuilderMock, - $this->transferBuilderMock, - $this->gatewayMock, - $this->responseHandlerMock + $this->transferFactoryMock, + $this->clientMock, + $this->responseHandlerMock, + $this->validatorMock ); } @@ -54,26 +62,35 @@ class GatewayCommandTest extends \PHPUnit_Framework_TestCase $commandSubject = ['authorize']; $request = ['request_field1' => 'request_value1', 'request_field2' => 'request_value2']; $response = ['response_field1' => 'response_value1']; + $validationResult = $this->getMockBuilder('Magento\Payment\Gateway\Validator\ResultInterface') + ->getMockForAbstractClass(); $transferO = $this->getMockBuilder('Magento\Payment\Gateway\Http\TransferInterface') ->getMockForAbstractClass(); - $this->requestBuilderMock->expects($this->once()) + $this->requestBuilderMock->expects(static::once()) ->method('build') ->with($commandSubject) ->willReturn($request); - $this->transferBuilderMock->expects($this->once()) - ->method('build') + $this->transferFactoryMock->expects(static::once()) + ->method('create') ->with($request) ->willReturn($transferO); - $this->gatewayMock->expects($this->once()) + $this->clientMock->expects(static::once()) ->method('placeRequest') ->with($transferO) ->willReturn($response); + $this->validatorMock->expects(static::once()) + ->method('validate') + ->with(array_merge($commandSubject, ['response' =>$response])) + ->willReturn($validationResult); + $validationResult->expects(static::once()) + ->method('isValid') + ->willReturn(true); - $this->responseHandlerMock->expects($this->once()) + $this->responseHandlerMock->expects(static::once()) ->method('handle') ->with($commandSubject, $response); diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Config/ValueHandlerPoolTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Config/ValueHandlerPoolTest.php index a10523f6496..266128b42f6 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Config/ValueHandlerPoolTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Config/ValueHandlerPoolTest.php @@ -12,14 +12,14 @@ class ValueHandlerPoolTest extends \PHPUnit_Framework_TestCase public function testConstructorException() { $this->setExpectedException('LogicException'); - $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') ->disableOriginalConstructor() + ->setMethods(['create']) ->getMock(); - $tMap->expects(static::once()) - ->method('offsetExists') - ->with(ValueHandlerPool::DEFAULT_HANDLER) - ->willReturn(false); - new ValueHandlerPool($tMap); + + $tMapFactory->expects(static::never()) + ->method('create'); + new ValueHandlerPool([], $tMapFactory); } public function testGet() @@ -30,10 +30,27 @@ class ValueHandlerPoolTest extends \PHPUnit_Framework_TestCase $someValueHandler = $this->getMockBuilder('Magento\Payment\Gateway\Config\ValueHandlerInterface') ->disableOriginalConstructor() ->getMockForAbstractClass(); + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); - $tMap->expects(static::exactly(4)) + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [ + ValueHandlerPool::DEFAULT_HANDLER => 'Magento\Payment\Gateway\Config\ValueHandlerInterface', + 'some_value' => 'Magento\Payment\Gateway\Config\ValueHandlerInterface' + ], + 'type' => 'Magento\Payment\Gateway\Config\ValueHandlerInterface' + ] + ) + ->willReturn($tMap); + $tMap->expects(static::exactly(3)) ->method('offsetExists') ->willReturnMap( [ @@ -50,7 +67,13 @@ class ValueHandlerPoolTest extends \PHPUnit_Framework_TestCase ] ); - $pool = new ValueHandlerPool($tMap); + $pool = new ValueHandlerPool( + [ + ValueHandlerPool::DEFAULT_HANDLER => 'Magento\Payment\Gateway\Config\ValueHandlerInterface', + 'some_value' => 'Magento\Payment\Gateway\Config\ValueHandlerInterface' + ], + $tMapFactory + ); static::assertSame($someValueHandler, $pool->get('some_value')); static::assertSame($defaultHandler, $pool->get(ValueHandlerPool::DEFAULT_HANDLER)); static::assertSame($defaultHandler, $pool->get('no_custom_logic_required')); diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Data/Order/AddressAdapterTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Data/Order/AddressAdapterTest.php index a31a859d541..fc8ea141c1a 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Data/Order/AddressAdapterTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Data/Order/AddressAdapterTest.php @@ -32,8 +32,8 @@ class AddressAdapterTest extends \PHPUnit_Framework_TestCase public function testGetRegion() { $expected = 'California'; - $this->orderAddressMock->expects($this->once())->method('getRegion')->willReturn($expected); - $this->assertEquals($expected, $this->model->getRegion()); + $this->orderAddressMock->expects($this->once())->method('getRegionCode')->willReturn($expected); + $this->assertEquals($expected, $this->model->getRegionCode()); } public function testGetCountryId() diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Data/Quote/AddressAdapterTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Data/Quote/AddressAdapterTest.php index 5674f0eba1c..84ad8947b35 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Data/Quote/AddressAdapterTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Data/Quote/AddressAdapterTest.php @@ -32,8 +32,8 @@ class AddressAdapterTest extends \PHPUnit_Framework_TestCase public function testGetRegion() { $expected = 'California'; - $this->quoteAddressMock->expects($this->once())->method('getRegion')->willReturn($expected); - $this->assertEquals($expected, $this->model->getRegion()); + $this->quoteAddressMock->expects($this->once())->method('getRegionCode')->willReturn($expected); + $this->assertEquals($expected, $this->model->getRegionCode()); } public function testGetCountryId() diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Http/Client/ZendTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Http/Client/ZendTest.php index ec6e6a3e04a..43f2a400ccd 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Http/Client/ZendTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Http/Client/ZendTest.php @@ -39,6 +39,11 @@ class ZendTest extends \PHPUnit_Framework_TestCase */ protected $transferObjectMock; + /** + * @var \Magento\Payment\Model\Method\Logger|\PHPUnit_Framework_MockObject_MockObject + */ + protected $loggerMock; + protected function setUp() { $this->converterMock = $this->getMockBuilder('Magento\Payment\Gateway\Http\ConverterInterface') @@ -53,10 +58,14 @@ class ZendTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); + $this->loggerMock = $this->getMockBuilder('Magento\Payment\Model\Method\Logger') + ->disableOriginalConstructor() + ->getMock(); + $this->transferObjectMock = $this->getMockBuilder('Magento\Payment\Gateway\Http\TransferInterface') ->getMockForAbstractClass(); - $this->model = new Zend($this->zendClientFactoryMock, $this->converterMock); + $this->model = new Zend($this->zendClientFactoryMock, $this->converterMock, $this->loggerMock); } public function testPlaceRequest() @@ -136,7 +145,7 @@ class ZendTest extends \PHPUnit_Framework_TestCase $this->transferObjectMock->expects($this->once())->method('getClientConfig')->willReturn($config); $this->transferObjectMock->expects($this->atLeastOnce())->method('getMethod')->willReturn($method); $this->transferObjectMock->expects($this->once())->method('getHeaders')->willReturn($headers); - $this->transferObjectMock->expects($this->once())->method('getBody')->willReturn($body); + $this->transferObjectMock->expects($this->atLeastOnce())->method('getBody')->willReturn($body); $this->transferObjectMock->expects($this->once())->method('shouldEncode')->willReturn($shouldEncode); $this->transferObjectMock->expects($this->once())->method('getUri')->willReturn($uri); diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Http/Converter/HtmlFormConverterTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Http/Converter/HtmlFormConverterTest.php new file mode 100644 index 00000000000..8f2792fe4b9 --- /dev/null +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Http/Converter/HtmlFormConverterTest.php @@ -0,0 +1,57 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Payment\Test\Unit\Gateway\Http\Converter; + +use Magento\Payment\Gateway\Http\Converter\HtmlFormConverter; + +class HtmlFormConverterTest extends \PHPUnit_Framework_TestCase +{ + public function testConvert() + { + $expectedResult = [ + 'parameter1' => 'val1', + 'parameter2' => 'val2', + 'parameter3' => 'val3' + ]; + + $converter = new HtmlFormConverter(); + static::assertEquals($expectedResult, $converter->convert($this->getValidFormHtml())); + } + + public function testConvertNotValidHtml() + { + $converter = new HtmlFormConverter(); + $converter->convert('Not html. Really not.'); + } + + /** + * Returns valid form HTML + * + * @return string + */ + private function getValidFormHtml() + { + return ' + <!DOCTYPE HTML> + <html> + <head> + <meta charset="utf-8"> + <title>Title</title> + </head> + <body> + + <form action="some"> + <p><input type="radio" name="parameter1" value="val1">val1<Br> + <input type="radio" name="parameter2" value="val2">val2<Br> + <input type="radio" name="parameter3" value="val3">val3</p> + <p><input type="submit"></p> + </form> + + </body> + </html> + '; + } +} diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Http/TransferTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Http/TransferTest.php new file mode 100644 index 00000000000..bdecd39bc83 --- /dev/null +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Http/TransferTest.php @@ -0,0 +1,37 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Payment\Test\Unit\Gateway\Http; + +use Magento\Payment\Gateway\Http\Transfer; + +class TransferTest extends \PHPUnit_Framework_TestCase +{ + public function testIO() + { + $clientConfig = ['config']; + $headers = ['Header']; + $body = ['data', 'data2']; + $method = 'POST'; + $uri = 'https://gateway.com'; + $encode = false; + + $transfer = new Transfer( + $clientConfig, + $headers, + $body, + $method, + $uri, + $encode + ); + + static::assertSame($clientConfig, $transfer->getClientConfig()); + static::assertSame($headers, $transfer->getHeaders()); + static::assertSame($body, $transfer->getBody()); + static::assertSame($method, $transfer->getMethod()); + static::assertSame($uri, $transfer->getUri()); + static::assertSame($encode, $transfer->shouldEncode()); + } +} diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Request/BuilderCompositeTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Request/BuilderCompositeTest.php index 39d9339d2d9..e1e5ea54745 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Request/BuilderCompositeTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Request/BuilderCompositeTest.php @@ -11,13 +11,28 @@ class BuilderCompositeTest extends \PHPUnit_Framework_TestCase { public function testBuildEmpty() { + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [], + 'type' => 'Magento\Payment\Gateway\Request\BuilderInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('getIterator') ->willReturn(new \ArrayIterator([])); - $builder = new BuilderComposite($tMap); + + $builder = new BuilderComposite([], $tMapFactory); static::assertEquals([], $builder->build([])); } @@ -27,12 +42,18 @@ class BuilderCompositeTest extends \PHPUnit_Framework_TestCase 'user' => 'Mrs G. Crump', 'url' => 'https://url.in', 'amount' => 10.00, - 'currecy' => 'pound', + 'currency' => 'pound', 'address' => '46 Egernon Crescent', 'item' => 'gas cooker', 'quantity' => 1 ]; - + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') + ->disableOriginalConstructor() + ->getMock(); $customerBuilder = $this->getMockBuilder('Magento\Payment\Gateway\Request\BuilderInterface') ->getMockForAbstractClass(); $productBuilder = $this->getMockBuilder('Magento\Payment\Gateway\Request\BuilderInterface') @@ -53,7 +74,7 @@ class BuilderCompositeTest extends \PHPUnit_Framework_TestCase ->willReturn( [ 'amount' => 10.00, - 'currecy' => 'pound', + 'currency' => 'pound', 'item' => 'gas cooker', 'quantity' => 1 ] @@ -66,14 +87,31 @@ class BuilderCompositeTest extends \PHPUnit_Framework_TestCase ] ); - $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') - ->disableOriginalConstructor() - ->getMock(); + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [ + 'customer' => 'Magento\Payment\Gateway\Request\BuilderInterface', + 'product' => 'Magento\Payment\Gateway\Request\BuilderInterface', + 'magento' => 'Magento\Payment\Gateway\Request\BuilderInterface' + ], + 'type' => 'Magento\Payment\Gateway\Request\BuilderInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('getIterator') ->willReturn(new \ArrayIterator([$customerBuilder, $productBuilder, $magentoBuilder])); - $builder = new BuilderComposite($tMap); + $builder = new BuilderComposite( + [ + 'customer' => 'Magento\Payment\Gateway\Request\BuilderInterface', + 'product' => 'Magento\Payment\Gateway\Request\BuilderInterface', + 'magento' => 'Magento\Payment\Gateway\Request\BuilderInterface' + ], + $tMapFactory + ); static::assertEquals($expectedRequest, $builder->build([])); } diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Response/HandlerChainTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Response/HandlerChainTest.php index 716fe3246ae..c65a826a262 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Response/HandlerChainTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Response/HandlerChainTest.php @@ -15,10 +15,26 @@ class HandlerChainTest extends \PHPUnit_Framework_TestCase ->getMockForAbstractClass(); $handler2 = $this->getMockBuilder('Magento\Payment\Gateway\Response\HandlerInterface') ->getMockForAbstractClass(); - + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [ + 'handler1' => 'Magento\Payment\Gateway\Response\HandlerInterface', + 'handler2' => 'Magento\Payment\Gateway\Response\HandlerInterface' + ], + 'type' => 'Magento\Payment\Gateway\Response\HandlerInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('getIterator') ->willReturn(new \ArrayIterator([$handler1, $handler2])); @@ -32,7 +48,13 @@ class HandlerChainTest extends \PHPUnit_Framework_TestCase ->method('handle') ->with($handlingSubject, $response); - $chain = new HandlerChain($tMap); + $chain = new HandlerChain( + [ + 'handler1' => 'Magento\Payment\Gateway\Response\HandlerInterface', + 'handler2' => 'Magento\Payment\Gateway\Response\HandlerInterface' + ], + $tMapFactory + ); $chain->handle($handlingSubject, $response); } } diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorCompositeTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorCompositeTest.php index 9150e83f0e7..8528b65ac6c 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorCompositeTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorCompositeTest.php @@ -16,10 +16,26 @@ class ValidatorCompositeTest extends \PHPUnit_Framework_TestCase ->getMockForAbstractClass(); $validator2 = $this->getMockBuilder('Magento\Payment\Gateway\Validator\ValidatorInterface') ->getMockForAbstractClass(); - + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [ + 'validator1' => 'Magento\Payment\Gateway\Validator\ValidatorInterface', + 'validator2' => 'Magento\Payment\Gateway\Validator\ValidatorInterface' + ], + 'type' => 'Magento\Payment\Gateway\Validator\ValidatorInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('getIterator') ->willReturn(new \ArrayIterator([$validator1, $validator2])); @@ -64,7 +80,14 @@ class ValidatorCompositeTest extends \PHPUnit_Framework_TestCase ->willReturn($compositeResult); - $validatorComposite = new ValidatorComposite($resultFactory, $tMap); + $validatorComposite = new ValidatorComposite( + $resultFactory, + [ + 'validator1' => 'Magento\Payment\Gateway\Validator\ValidatorInterface', + 'validator2' => 'Magento\Payment\Gateway\Validator\ValidatorInterface' + ], + $tMapFactory + ); static::assertSame($compositeResult, $validatorComposite->validate($validationSubject)); } } diff --git a/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorPoolTest.php b/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorPoolTest.php index c48aca93d6e..becc387fab2 100644 --- a/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorPoolTest.php +++ b/app/code/Magento/Payment/Test/Unit/Gateway/Validator/ValidatorPoolTest.php @@ -16,6 +16,20 @@ class ValidatorPoolTest extends \PHPUnit_Framework_TestCase $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => ['validator' => 'Magento\Payment\Gateway\Validator\ValidatorInterface'], + 'type' => 'Magento\Payment\Gateway\Validator\ValidatorInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('offsetExists') ->with('validator') @@ -25,7 +39,10 @@ class ValidatorPoolTest extends \PHPUnit_Framework_TestCase ->with('validator') ->willReturn($commandI); - $pool = new ValidatorPool($tMap); + $pool = new ValidatorPool( + ['validator' => 'Magento\Payment\Gateway\Validator\ValidatorInterface'], + $tMapFactory + ); static::assertSame($commandI, $pool->get('validator')); } @@ -33,15 +50,30 @@ class ValidatorPoolTest extends \PHPUnit_Framework_TestCase public function testGetException() { $this->setExpectedException('Magento\Framework\Exception\NotFoundException'); + + $tMapFactory = $this->getMockBuilder('Magento\Framework\ObjectManager\TMapFactory') + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); $tMap = $this->getMockBuilder('Magento\Framework\ObjectManager\TMap') ->disableOriginalConstructor() ->getMock(); + + $tMapFactory->expects(static::once()) + ->method('create') + ->with( + [ + 'array' => [], + 'type' => 'Magento\Payment\Gateway\Validator\ValidatorInterface' + ] + ) + ->willReturn($tMap); $tMap->expects(static::once()) ->method('offsetExists') ->with('validator') ->willReturn(false); - $pool = new ValidatorPool($tMap); + $pool = new ValidatorPool([], $tMapFactory); $pool->get('validator'); } } diff --git a/app/code/Magento/Payment/etc/payment.xml b/app/code/Magento/Payment/etc/payment.xml index b034e1695e0..5560a70f11b 100644 --- a/app/code/Magento/Payment/etc/payment.xml +++ b/app/code/Magento/Payment/etc/payment.xml @@ -32,5 +32,17 @@ <type id="OT" order="1000"> <label>Other</label> </type> + <type id="DN" order="60"> + <label>Diners</label> + </type> + <type id="JC" order="70"> + <label>JCB</label> + </type> + <type id="MI" order="80"> + <label>Maestro International</label> + </type> + <type id="MD" order="100"> + <label>Maestro Domestic</label> + </type> </credit_cards> </payment> diff --git a/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml b/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml index e9632aa0f89..c6a429a0fbe 100644 --- a/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml +++ b/app/code/Magento/Payment/view/adminhtml/templates/transparent/form.phtml @@ -22,6 +22,7 @@ $code = $block->getMethodCode(); "cardFieldsMap":<?php echo $block->getCardFieldsMap() ?>, "orderSaveUrl":"<?php echo $block->getOrderUrl() ?>", "cgiUrl":"<?php echo $block->getCgiUrl() ?>", + "expireYearLength":"<?php echo $block->getMethodConfigData('cc_year_length') ?>", "nativeAction":"<?php echo $block->getUrl('*/*/save', ['_secure' => $block->getRequest()->isSecure()]) ?>" }, "validation":[]}' style="display:none;"> diff --git a/app/code/Magento/Payment/view/adminhtml/web/transparent.js b/app/code/Magento/Payment/view/adminhtml/web/transparent.js index 1317880d7f0..7edbb30c631 100644 --- a/app/code/Magento/Payment/view/adminhtml/web/transparent.js +++ b/app/code/Magento/Payment/view/adminhtml/web/transparent.js @@ -23,7 +23,8 @@ define([ controller: null, gateway: null, dateDelim: null, - cardFieldsMap: null + cardFieldsMap: null, + expireYearLength: 2 }, _create: function() { @@ -52,6 +53,9 @@ define([ */ _orderSave: function() { var postData = "form_key="+FORM_KEY; + postData += '&cc_type=' + this.element.find( + '[data-container="' + this.options.gateway + '-cc-type"]' + ).val(); $.ajax({ url: this.options.orderSaveUrl, type: 'post', @@ -135,8 +139,8 @@ define([ this.element.find('[data-container="' + this.options.gateway + '-cc-month"]').val() , 10 ); - if (year.length > 2) { - year = year.substring(2); + if (year.length > this.options.expireYearLength) { + year = year.substring(year.length - this.options.expireYearLength); } if (month < 10) { month = '0' + month; diff --git a/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml b/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml index 93ac9970e14..c3c4a3ca098 100644 --- a/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml +++ b/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml @@ -20,6 +20,7 @@ $params = $block->getParams(); window.top.alert(<?php echo $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode($params['error_msg']) ?>); var require = window.top.require; require(['jquery'], function($) { + $('#edit_form').trigger('processStop'); $('#opc-review').trigger('hideAjaxLoader'); }); <?php elseif (isset($params['order_success'])): ?> @@ -27,6 +28,16 @@ $params = $block->getParams(); <?php else: ?> var require = window.top.require; require(['jquery'], function($) { + $('#edit_form').trigger('processStop'); + + $("input[name='payment[cc_number]']").prop('disabled', true); + $("select[name='payment[cc_type]']").prop('disabled', true); + $("select[name='payment[cc_exp_month]']").prop('disabled', true); + $("select[name='payment[cc_exp_year]']").prop('disabled', true); + $("input[name='payment[cc_cid]']").prop('disabled', true); + + $('#edit_form').trigger('realOrder'); + $('#originalPlaceOrder').click(); }); <?php endif; ?> diff --git a/app/code/Magento/Payment/view/frontend/web/js/view/review/actions/iframe.js b/app/code/Magento/Payment/view/frontend/web/js/view/review/actions/iframe.js index a5a78d731cf..5349dab7b4d 100644 --- a/app/code/Magento/Payment/view/frontend/web/js/view/review/actions/iframe.js +++ b/app/code/Magento/Payment/view/frontend/web/js/view/review/actions/iframe.js @@ -39,6 +39,9 @@ define( }, originalPlaceOrder: function(parent) { return parent.placeOrder.bind(parent); + }, + getExpireYearLength: function(parent) { + return window.checkoutConfig.payment.iframe.expireYearLength[this.getCode()]; } }); } diff --git a/app/code/Magento/Payment/view/frontend/web/template/review/actions/iframe.html b/app/code/Magento/Payment/view/frontend/web/template/review/actions/iframe.html index cd9c3342c73..df5212f51e0 100644 --- a/app/code/Magento/Payment/view/frontend/web/template/review/actions/iframe.html +++ b/app/code/Magento/Payment/view/frontend/web/template/review/actions/iframe.html @@ -14,7 +14,8 @@ 'cgiUrl': getCgiUrl(), 'dateDelim': getDateDelim(), 'cardFieldsMap': getCardFieldsMap(), - 'nativeAction': getSaveOrderUrl() + 'nativeAction': getSaveOrderUrl(), + 'expireYearLength': getExpireYearLength() }, 'validation':[]}"> <!-- ko with: getCcFormView() --> <!-- ko template: getTemplate() --><!-- /ko --> diff --git a/app/code/Magento/Payment/view/frontend/web/transparent.js b/app/code/Magento/Payment/view/frontend/web/transparent.js index 570772d6d43..6394cf38fee 100644 --- a/app/code/Magento/Payment/view/frontend/web/transparent.js +++ b/app/code/Magento/Payment/view/frontend/web/transparent.js @@ -28,7 +28,8 @@ define([ controller: null, gateway: null, dateDelim: null, - cardFieldsMap: null + cardFieldsMap: null, + expireYearLength: 2 }, _create: function() { @@ -60,6 +61,10 @@ define([ postData += '&' + $(this.options.reviewAgreementForm).serialize(); } postData += '&controller=' + this.options.controller; + postData += '&cc_type=' + this.element.find( + '[data-container="' + this.options.gateway + '-cc-type"]' + ).val(); + $.ajax({ url: this.options.orderSaveUrl, type: 'post', @@ -140,9 +145,10 @@ define([ this.element.find('[data-container="' + this.options.gateway + '-cc-month"]').val(), 10 ); - if (year.length > 2) { - year = year.substring(2); + if (year.length > this.options.expireYearLength) { + year = year.substring(year.length - this.options.expireYearLength); } + if (month < 10) { month = '0' + month; } diff --git a/app/code/Magento/Quote/Api/Data/CartInterface.php b/app/code/Magento/Quote/Api/Data/CartInterface.php index 64eb62f72a2..a663618a0b8 100644 --- a/app/code/Magento/Quote/Api/Data/CartInterface.php +++ b/app/code/Magento/Quote/Api/Data/CartInterface.php @@ -54,6 +54,8 @@ interface CartInterface extends \Magento\Framework\Api\ExtensibleDataInterface const KEY_CUSTOMER_TAX_CLASS_ID = 'customer_tax_class_id'; + const KEY_STORE_ID = 'store_id'; + /**#@-*/ /** @@ -350,6 +352,21 @@ interface CartInterface extends \Magento\Framework\Api\ExtensibleDataInterface */ public function setCustomerTaxClassId($customerTaxClassId); + /** + * Get store identifier + * + * @return int + */ + public function getStoreId(); + + /** + * Sets store identifier + * + * @param int $storeId + * @return $this + */ + public function setStoreId($storeId); + /** * Retrieve existing extension attributes object or create a new one. * diff --git a/app/code/Magento/Quote/Model/BillingAddressManagement.php b/app/code/Magento/Quote/Model/BillingAddressManagement.php index cad5a3b9c42..cdfe295ac7c 100644 --- a/app/code/Magento/Quote/Model/BillingAddressManagement.php +++ b/app/code/Magento/Quote/Model/BillingAddressManagement.php @@ -67,6 +67,7 @@ class BillingAddressManagement implements BillingAddressManagementInterface public function assign($cartId, \Magento\Quote\Api\Data\AddressInterface $address, $useForShipping = false) { $quote = $this->quoteRepository->getActive($cartId); + $this->addressValidator->validate($address); $customerAddressId = $address->getCustomerAddressId(); $shippingAddress = null; diff --git a/app/code/Magento/Quote/Model/Quote.php b/app/code/Magento/Quote/Model/Quote.php index 9cc216d0901..a5e8b7a971e 100644 --- a/app/code/Magento/Quote/Model/Quote.php +++ b/app/code/Magento/Quote/Model/Quote.php @@ -27,7 +27,6 @@ use Magento\Framework\Api\AttributeValueFactory; * sales_quote_delete_before * sales_quote_delete_after * - * @method Quote setStoreId(int $value) * @method int getIsMultiShipping() * @method Quote setIsMultiShipping(int $value) * @method float getStoreToBaseRate() @@ -678,16 +677,23 @@ class Quote extends AbstractExtensibleModel implements \Magento\Quote\Api\Data\C //@codeCoverageIgnoreEnd /** - * Get quote store identifier - * - * @return int + * {@inheritdoc} */ public function getStoreId() { if (!$this->hasStoreId()) { return $this->_storeManager->getStore()->getId(); } - return $this->_getData('store_id'); + return (int)$this->_getData(self::KEY_STORE_ID); + } + + /** + * {@inheritdoc} + */ + public function setStoreId($storeId) + { + $this->setData(self::KEY_STORE_ID, (int)$storeId); + return $this; } /** diff --git a/app/code/Magento/Quote/Model/Quote/Payment.php b/app/code/Magento/Quote/Model/Quote/Payment.php index bb98b0d85ca..04f583d1c25 100644 --- a/app/code/Magento/Quote/Model/Quote/Payment.php +++ b/app/code/Magento/Quote/Model/Quote/Payment.php @@ -5,6 +5,8 @@ */ namespace Magento\Quote\Model\Quote; +use Magento\Payment\Model\Method\AbstractMethod; + /** * Quote payment information * @@ -209,7 +211,7 @@ class Payment extends \Magento\Payment\Model\Info implements \Magento\Quote\Api\ public function getOrderPlaceRedirectUrl() { $method = $this->getMethodInstance(); - if ($method) { + if ($method && $method instanceof AbstractMethod) { return $method->getOrderPlaceRedirectUrl(); } return ''; diff --git a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php index 3690aa6cbf3..9105e37f664 100644 --- a/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php +++ b/app/code/Magento/Quote/Test/Unit/Model/QuoteRepositoryTest.php @@ -109,7 +109,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->never())->method('setSharedStoreIds'); $this->quoteMock->expects($this->once()) ->method('load') @@ -126,7 +126,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->never())->method('setSharedStoreIds'); $this->quoteMock->expects($this->once()) ->method('load') @@ -145,7 +145,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->once()) ->method('setSharedStoreIds') ->with($sharedStoreIds) @@ -167,7 +167,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->never())->method('setSharedStoreIds'); $this->quoteMock->expects($this->once()) ->method('loadByCustomer') @@ -189,7 +189,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->never())->method('setSharedStoreIds'); $this->quoteMock->expects($this->once()) ->method('load') @@ -211,7 +211,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->never())->method('setSharedStoreIds'); $this->quoteMock->expects($this->once()) ->method('load') @@ -229,7 +229,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->never())->method('setSharedStoreIds'); $this->quoteMock->expects($this->once()) ->method('load') @@ -249,7 +249,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->once()) ->method('setSharedStoreIds') ->with($sharedStoreIds) @@ -272,7 +272,7 @@ class QuoteRepositoryTest extends \PHPUnit_Framework_TestCase $this->quoteFactoryMock->expects($this->once())->method('create')->willReturn($this->quoteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->willReturn($this->storeMock); - $this->storeMock->expects($this->once())->method('getId')->willReturn($this->storeMock); + $this->storeMock->expects($this->once())->method('getId')->willReturn(1); $this->quoteMock->expects($this->never())->method('setSharedStoreIds'); $this->quoteMock->expects($this->once()) ->method('loadByCustomer') diff --git a/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php b/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php index dfd663234da..fee0c4c9047 100644 --- a/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php +++ b/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php @@ -247,6 +247,13 @@ interface OrderAddressInterface extends \Magento\Framework\Api\ExtensibleDataInt */ public function getRegion(); + /** + * Return 2 letter state code if available, otherwise full region name + * + * @return null|string + */ + public function getRegionCode(); + /** * Gets the region ID for the order address. * diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/ClassesTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/ClassesTest.php index b190aee7f88..9bc08c21c00 100644 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/ClassesTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Integrity/ClassesTest.php @@ -7,6 +7,8 @@ */ namespace Magento\Test\Integrity; +use Magento\Framework\App\Utility\Classes; + class ClassesTest extends \PHPUnit_Framework_TestCase { /** @@ -31,7 +33,7 @@ class ClassesTest extends \PHPUnit_Framework_TestCase */ function ($file) { $contents = file_get_contents($file); - $classes = \Magento\Framework\App\Utility\Classes::getAllMatches( + $classes = Classes::getAllMatches( $contents, '/ # ::getResourceModel ::getBlockSingleton ::getModel ::getSingleton @@ -57,7 +59,7 @@ class ClassesTest extends \PHPUnit_Framework_TestCase ); // without modifier "i". Starting from capital letter is a significant characteristic of a class name - \Magento\Framework\App\Utility\Classes::getAllMatches( + Classes::getAllMatches( $contents, '/(?:\-> | parent\:\:)(?:_init | setType)\(\s* \'([A-Z][a-z\d][A-Za-z\d\\\\]+)\'(?:,\s*\'([A-Z][a-z\d][A-Za-z\d\\\\]+)\') @@ -82,7 +84,7 @@ class ClassesTest extends \PHPUnit_Framework_TestCase protected function _collectResourceHelpersPhp($contents, &$classes) { $regex = '/(?:\:\:|\->)getResourceHelper\(\s*\'([a-z\d\\\\]+)\'\s*\)/ix'; - $matches = \Magento\Framework\App\Utility\Classes::getAllMatches($contents, $regex); + $matches = Classes::getAllMatches($contents, $regex); foreach ($matches as $moduleName) { $classes[] = "{$moduleName}\\Model\\Resource\\Helper\\Mysql4"; } @@ -96,7 +98,7 @@ class ClassesTest extends \PHPUnit_Framework_TestCase * @param string $path */ function ($path) { - $classes = \Magento\Framework\App\Utility\Classes::collectClassesInConfig(simplexml_load_file($path)); + $classes = Classes::collectClassesInConfig(simplexml_load_file($path)); $this->_assertClassesExist($classes, $path); }, \Magento\Framework\App\Utility\Files::init()->getMainConfigFiles() @@ -113,26 +115,26 @@ class ClassesTest extends \PHPUnit_Framework_TestCase function ($path) { $xml = simplexml_load_file($path); - $classes = \Magento\Framework\App\Utility\Classes::getXmlNodeValues( + $classes = Classes::getXmlNodeValues( $xml, '/layout//*[contains(text(), "\\\\Block\\\\") or contains(text(), "\\\\Model\\\\") or contains(text(), "\\\\Helper\\\\")]' ); - foreach (\Magento\Framework\App\Utility\Classes::getXmlAttributeValues( + foreach (Classes::getXmlAttributeValues( $xml, '/layout//@helper', 'helper' ) as $class) { - $classes[] = \Magento\Framework\App\Utility\Classes::getCallbackClass($class); + $classes[] = Classes::getCallbackClass($class); } - foreach (\Magento\Framework\App\Utility\Classes::getXmlAttributeValues( + foreach (Classes::getXmlAttributeValues( $xml, '/layout//@module', 'module' ) as $module) { $classes[] = str_replace('_', '\\', "{$module}_Helper_Data"); } - $classes = array_merge($classes, \Magento\Framework\App\Utility\Classes::collectLayoutClasses($xml)); + $classes = array_merge($classes, Classes::collectLayoutClasses($xml)); $this->_assertClassesExist(array_unique($classes), $path); }, @@ -159,7 +161,7 @@ class ClassesTest extends \PHPUnit_Framework_TestCase $badUsages = []; foreach ($classes as $class) { try { - if (strrchr($class, '\\') == false) { + if (strrchr($class, '\\') === false and !Classes::isVirtual($class)) { $badUsages[] = $class; continue; } else { @@ -168,9 +170,9 @@ class ClassesTest extends \PHPUnit_Framework_TestCase self::$_existingClasses[$class] ) || \Magento\Framework\App\Utility\Files::init()->classFileExists( $class - ) || \Magento\Framework\App\Utility\Classes::isVirtual( + ) || Classes::isVirtual( $class - ) || \Magento\Framework\App\Utility\Classes::isAutogenerated( + ) || Classes::isAutogenerated( $class ) ); diff --git a/dev/tests/static/testsuite/Magento/Test/Integrity/ConfigTest.php b/dev/tests/static/testsuite/Magento/Test/Integrity/ConfigTest.php index 58d662260d8..6b439124a32 100644 --- a/dev/tests/static/testsuite/Magento/Test/Integrity/ConfigTest.php +++ b/dev/tests/static/testsuite/Magento/Test/Integrity/ConfigTest.php @@ -5,6 +5,8 @@ */ namespace Magento\Test\Integrity; +use Magento\Framework\App\Utility\Classes; + class ConfigTest extends \PHPUnit_Framework_TestCase { public function testPaymentMethods() @@ -19,12 +21,14 @@ class ConfigTest extends \PHPUnit_Framework_TestCase $nodes = $config->xpath('/config/default/payment/*/model') ?: []; $formalModuleName = str_replace('_', '\\', $moduleName); foreach ($nodes as $node) { - $this->assertStringStartsWith( - $formalModuleName . '\Model\\', - (string)$node, - "'{$node}' payment method is declared in '{$configFile}' module, " . - "but doesn't belong to '{$moduleName}' module" - ); + if (!Classes::isVirtual((string)$node)) { + $this->assertStringStartsWith( + $formalModuleName . '\Model\\', + (string)$node, + "'{$node}' payment method is declared in '{$configFile}' module, " . + "but doesn't belong to '{$moduleName}' module" + ); + } } }, $this->paymentMethodsDataProvider() diff --git a/lib/internal/Magento/Framework/Intl/DateTimeFactory.php b/lib/internal/Magento/Framework/Intl/DateTimeFactory.php new file mode 100644 index 00000000000..089dc901709 --- /dev/null +++ b/lib/internal/Magento/Framework/Intl/DateTimeFactory.php @@ -0,0 +1,25 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Framework\Intl; + +/** + * Class DateTimeFactory + * @package Magento\Framework + */ +class DateTimeFactory +{ + /** + * Factory method for \DateTime + * + * @param string $time + * @param \DateTimeZone $timezone + * @return \DateTime + */ + public function create($time = 'now', \DateTimeZone $timezone = null) + { + return new \DateTime($time, $timezone); + } +} diff --git a/lib/internal/Magento/Framework/Intl/README.md b/lib/internal/Magento/Framework/Intl/README.md new file mode 100644 index 00000000000..7257506ebe4 --- /dev/null +++ b/lib/internal/Magento/Framework/Intl/README.md @@ -0,0 +1,3 @@ +# Intl + +**Intl** provides an access to Intl extension library wrappers. diff --git a/lib/internal/Magento/Framework/ObjectManager/TMap.php b/lib/internal/Magento/Framework/ObjectManager/TMap.php index 759ed739d62..b15b87ed467 100644 --- a/lib/internal/Magento/Framework/ObjectManager/TMap.php +++ b/lib/internal/Magento/Framework/ObjectManager/TMap.php @@ -44,24 +44,16 @@ class TMap implements \IteratorAggregate, \Countable, \ArrayAccess */ private $configInterface; - /** - * @var ClassReaderInterface - */ - private $classReaderInterface; - - /** * @param string $type * @param ObjectManagerInterface $objectManager * @param ConfigInterface $configInterface - * @param ClassReaderInterface $classReaderInterface * @param array $array */ public function __construct( $type, ObjectManagerInterface $objectManager, ConfigInterface $configInterface, - ClassReaderInterface $classReaderInterface, array $array = [] ) { if (!class_exists($this->type) && !interface_exists($type)) { @@ -72,7 +64,6 @@ class TMap implements \IteratorAggregate, \Countable, \ArrayAccess $this->objectManager = $objectManager; $this->configInterface = $configInterface; - $this->classReaderInterface = $classReaderInterface; array_walk( $array, @@ -99,7 +90,12 @@ class TMap implements \IteratorAggregate, \Countable, \ArrayAccess $this->configInterface->getPreference($instanceName) ); - if (!in_array($this->type, $this->classReaderInterface->getParents($realType), true)) { + if ( + !in_array( + $this->type, + array_unique(array_merge(class_parents($realType), class_implements($realType))), + true + )) { $this->throwTypeException($realType, $index); } } diff --git a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/TMapTest.php b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/TMapTest.php index 6ce188335d8..4e599bd2356 100644 --- a/lib/internal/Magento/Framework/ObjectManager/Test/Unit/TMapTest.php +++ b/lib/internal/Magento/Framework/ObjectManager/Test/Unit/TMapTest.php @@ -22,11 +22,6 @@ class TMapTest extends \PHPUnit_Framework_TestCase */ private $omConfig; - /** - * @var \PHPUnit_Framework_MockObject_MockObject | \Magento\Framework\Code\Reader\ClassReaderInterface - */ - private $cReader; - public function setUp() { $this->om = $this->getMockBuilder('Magento\Framework\ObjectManagerInterface') @@ -34,9 +29,6 @@ class TMapTest extends \PHPUnit_Framework_TestCase $this->omConfig = $this->getMockBuilder('Magento\Framework\ObjectManager\ConfigInterface') ->getMockForAbstractClass(); - - $this->cReader = $this->getMockBuilder('Magento\Framework\Code\Reader\ClassReaderInterface') - ->getMockForAbstractClass(); } public function testConstructor() @@ -154,19 +146,10 @@ class TMapTest extends \PHPUnit_Framework_TestCase ] ); - $this->cReader->expects(static::exactly($exactlyCalls)) - ->method('getParents') - ->willReturnMap( - [ - ['TClass', ['TInterface']] - ] - ); - return new TMap( 'TInterface', $this->om, $this->omConfig, - $this->cReader, $testClasses ); } diff --git a/lib/internal/Magento/Framework/View/Element/Template.php b/lib/internal/Magento/Framework/View/Element/Template.php index a7f4b683343..8e1c8e4cb27 100644 --- a/lib/internal/Magento/Framework/View/Element/Template.php +++ b/lib/internal/Magento/Framework/View/Element/Template.php @@ -7,7 +7,6 @@ namespace Magento\Framework\View\Element; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; -use Magento\Framework\View\Template\Html\Minifier; /** * Base html block -- GitLab From 1a9b70203cc202ad32db57e27f23bffbbd7abaff Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Fri, 19 Jun 2015 14:42:26 +0300 Subject: [PATCH 327/396] MAGETWO-36129: Update Content in Magento 2 by Modules - part 1 - fixed tests --- .../Cms/Test/Unit/Controller/Adminhtml/Block/DeleteTest.php | 2 +- .../Cms/Test/Unit/Controller/Adminhtml/Block/SaveTest.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 44335de6ff1..c32d11572cf 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 c74fa3e8fe4..0a1c7be6c95 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'); -- GitLab From aabd6643cdd30ceedc35fc4cb28dcc1749ebc8f5 Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Fri, 19 Jun 2015 14:54:30 +0300 Subject: [PATCH 328/396] MTA-2350: Add wait to form element before filling a value --- dev/tests/functional/composer.json | 2 +- .../Product/UpdateSimpleProductEntityTest.xml | 1 - .../UpdateVirtualProductEntityTest.xml | 47 ------------- .../Edit/Tab/Super/Config/Attribute.php | 2 +- .../CustomerReviewReportEntityTest.xml | 66 ++++++++++--------- .../Constraint/AssertProductReviewForm.php | 4 +- .../CreateProductReviewFrontendEntityTest.xml | 64 +++++++++--------- .../Tax/Test/Constraint/AssertTaxRateForm.php | 2 +- .../Adminhtml/Catalog/Edit/UrlRewriteForm.php | 50 ++++++++++---- 9 files changed, 107 insertions(+), 131 deletions(-) diff --git a/dev/tests/functional/composer.json b/dev/tests/functional/composer.json index 8ce924bd190..ca4b3bc7f79 100644 --- a/dev/tests/functional/composer.json +++ b/dev/tests/functional/composer.json @@ -1,6 +1,6 @@ { "require": { - "magento/mtf": "1.0.0-rc26", + "magento/mtf": "1.0.0-rc27", "php": "~5.5.0|~5.6.0", "phpunit/phpunit": "4.1.0", "phpunit/phpunit-selenium": ">=1.2", diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml index 05d4f3c4bc8..4dde51eae09 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateSimpleProductEntityTest.xml @@ -70,7 +70,6 @@ <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSearchableBySku" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> </variation> <variation name="UpdateSimpleProductEntityTestVariation5"> <data name="description" xsi:type="string">Update stock to Out of Stock</data> diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml index 0346cc1467f..d6607d67fd4 100644 --- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Product/UpdateVirtualProductEntityTest.xml @@ -15,11 +15,8 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -38,18 +35,13 @@ <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> <data name="product/data/special_price" xsi:type="string">45</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> @@ -64,17 +56,13 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductOutOfStock" /> @@ -86,14 +74,8 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">99.99</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -108,14 +90,8 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">5.00</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">None</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -134,10 +110,8 @@ <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -154,14 +128,10 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">99.99</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">None</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> <data name="product/data/special_price" xsi:type="string">45</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -176,14 +146,9 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">5.00</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -201,9 +166,6 @@ <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">999</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> - <data name="product/data/group_price/preset" xsi:type="string">-</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> <data name="product/data/custom_options/preset" xsi:type="string">options-suite</data> <data name="product/data/visibility" xsi:type="string">Search</data> @@ -221,14 +183,9 @@ <data name="product/data/sku" xsi:type="string">virtual_sku_%isolation%</data> <data name="product/data/price/value" xsi:type="string">99.99</data> <data name="product/data/tax_class_id/dataSet" xsi:type="string">taxable_goods</data> - <data name="product/data/quantity_and_stock_status/qty" xsi:type="string">-</data> <data name="product/data/is_virtual" xsi:type="string">Yes</data> - <data name="product/data/category_ids/presets" xsi:type="string">-</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> - <data name="product/data/tier_price/preset" xsi:type="string">-</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">Out of Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog, Search</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> @@ -247,19 +204,15 @@ <data name="product/data/is_virtual" xsi:type="string">Yes</data> <data name="product/data/category_ids/presets" xsi:type="string">default_subcategory</data> <data name="product/data/group_price/preset" xsi:type="string">MAGETWO-23055</data> - <data name="product/data/special_price" xsi:type="string">-</data> <data name="product/data/tier_price/preset" xsi:type="string">MAGETWO-23002</data> <data name="product/data/quantity_and_stock_status/is_in_stock" xsi:type="string">In Stock</data> - <data name="product/data/custom_options/preset" xsi:type="string">-</data> <data name="product/data/visibility" xsi:type="string">Catalog</data> <data name="product/data/url_key" xsi:type="string">virtual-product-%isolation%</data> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSaveMessage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInGrid" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductForm" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductVisibleInCategory" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductSpecialPriceOnProductPage" /> - <constraint name="Magento\Catalog\Test\Constraint\AssertProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductGroupedPriceOnProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductTierPriceOnProductPage" /> <constraint name="Magento\Catalog\Test\Constraint\AssertProductInCategory" /> diff --git a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php index 784950f01a6..17dc4b9d01f 100644 --- a/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php +++ b/dev/tests/functional/tests/app/Magento/ConfigurableProduct/Test/Block/Adminhtml/Product/Edit/Tab/Super/Config/Attribute.php @@ -247,7 +247,7 @@ class Attribute extends Form $attributeBlock->find($this->addOption)->click(); } $mapping = $this->dataMapping($option); - foreach ($mapping as $name => $field) { + foreach ($mapping as $field) { $element = $this->getElement($optionContainer, $field); if ($element->isVisible() && !$element->isDisabled()) { $element->setValue($field['value']); diff --git a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml index e996602cc41..26430b8ea9c 100644 --- a/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Reports/Test/TestCase/CustomerReviewReportEntityTest.xml @@ -6,36 +6,38 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Reports\Test\TestCase\CustomerReviewReportEntityTest"> - <variation name="CustomerReviewReportEntityTestVariation1"> - <data name="customerLogin" xsi:type="string">Yes</data> - <data name="product/dataSet" xsi:type="string">default</data> - <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> - <data name="reviewsCount" xsi:type="string">1</data> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer"/> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid"/> - </variation> - <variation name="CustomerReviewReportEntityTestVariation2"> - <data name="customerLogin" xsi:type="string">Yes</data> - <data name="product/dataSet" xsi:type="string">default</data> - <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> - <data name="reviewsCount" xsi:type="string">2</data> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer"/> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid"/> - </variation> - <variation name="CustomerReviewReportEntityTestVariation3"> - <data name="customerLogin" xsi:type="string">No</data> - <data name="product/dataSet" xsi:type="string">default</data> - <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> - <data name="reviewsCount" xsi:type="string">2</data> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer"/> - <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerNotInGrid"/> - </variation> - </testCase> + <testCase name="Magento\Reports\Test\TestCase\CustomerReviewReportEntityTest"> + <variation name="CustomerReviewReportEntityTestVariation1"> + <data name="customerLogin" xsi:type="string">Yes</data> + <data name="product/dataSet" xsi:type="string">default</data> + <data name="review/data/type" xsi:type="string">Customer</data> + <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> + <data name="reviewsCount" xsi:type="string">1</data> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer" /> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid" /> + </variation> + <variation name="CustomerReviewReportEntityTestVariation2"> + <data name="customerLogin" xsi:type="string">Yes</data> + <data name="product/dataSet" xsi:type="string">default</data> + <data name="review/data/type" xsi:type="string">Customer</data> + <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> + <data name="reviewsCount" xsi:type="string">2</data> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer" /> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerInGrid" /> + </variation> + <variation name="CustomerReviewReportEntityTestVariation3"> + <data name="customerLogin" xsi:type="string">No</data> + <data name="product/dataSet" xsi:type="string">default</data> + <data name="review/data/nickname" xsi:type="string">name_upd_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_upd_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_upd_%isolation%</data> + <data name="reviewsCount" xsi:type="string">2</data> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReviewsQtyByCustomer" /> + <constraint name="Magento\Reports\Test\Constraint\AssertProductReportByCustomerNotInGrid" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php index eb6cb92c40c..edf5cb90995 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php +++ b/dev/tests/functional/tests/app/Magento/Review/Test/Constraint/AssertProductReviewForm.php @@ -48,8 +48,8 @@ class AssertProductReviewForm extends AbstractAssertForm $fixtureData = $review->getData(); $formData = $reviewEdit->getReviewForm()->getData(); - if (isset($fixtureData['customer'])) { - $formData['customer'] = $reviewEdit->getReviewForm()->getPostedBy(); + if (isset($fixtureData['type'])) { + $formData['type'] = $reviewEdit->getReviewForm()->getPostedBy(); } $error = $this->verifyData($fixtureData, $formData); diff --git a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml index 747044f00e0..ee9096bce93 100644 --- a/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml +++ b/dev/tests/functional/tests/app/Magento/Review/Test/TestCase/CreateProductReviewFrontendEntityTest.xml @@ -6,37 +6,35 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Review\Test\TestCase\CreateProductReviewFrontendEntityTest"> - <variation name="CreateProductReviewFrontendEntityTestVariation1"> - <data name="description" xsi:type="string">Create product review with rating</data> - <data name="review/data/customer" xsi:type="string">-</data> - <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_%isolation%</data> - <data name="review/data/ratings/1/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> - <data name="review/data/ratings/1/rating" xsi:type="string">4</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingOnReviewPage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage"/> - </variation> - <variation name="CreateProductReviewFrontendEntityTestVariation2"> - <data name="description" xsi:type="string">MAGETWO-12403 - Add Product Review from Customer's Prospective</data> - <data name="review/data/customer" xsi:type="string">Guest</data> - <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> - <data name="review/data/title" xsi:type="string">title_%isolation%</data> - <data name="review/data/detail" xsi:type="string">review_%isolation%</data> - <data name="review/data/ratings/1/dataSet" xsi:type="string">-</data> - <data name="review/data/ratings/1/rating" xsi:type="string">-</data> - <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> - <data name="tag" xsi:type="string">test_type:acceptance_test</data> - <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewIsAbsentOnProductPage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewForm"/> - <constraint name="Magento\Review\Test\Constraint\AssertSetApprovedProductReview"/> - <constraint name="Magento\Review\Test\Constraint\AssertReviewLinksIsPresentOnProductPage"/> - <constraint name="Magento\Review\Test\Constraint\AssertProductReviewOnProductPage"/> - </variation> - </testCase> + <testCase name="Magento\Review\Test\TestCase\CreateProductReviewFrontendEntityTest"> + <variation name="CreateProductReviewFrontendEntityTestVariation1"> + <data name="description" xsi:type="string">Create product review with rating</data> + <data name="review/data/type" xsi:type="string">Guest</data> + <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_%isolation%</data> + <data name="review/data/ratings/1/dataSet" xsi:type="string">visibleOnDefaultWebsite</data> + <data name="review/data/ratings/1/rating" xsi:type="string">4</data> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewInGrid" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingOnReviewPage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductRatingInProductPage" /> + </variation> + <variation name="CreateProductReviewFrontendEntityTestVariation2"> + <data name="description" xsi:type="string">MAGETWO-12403 - Add Product Review from Customer's Prospective</data> + <data name="review/data/type" xsi:type="string">Guest</data> + <data name="review/data/nickname" xsi:type="string">name_%isolation%</data> + <data name="review/data/title" xsi:type="string">title_%isolation%</data> + <data name="review/data/detail" xsi:type="string">review_%isolation%</data> + <data name="review/data/entity_id/dataSet" xsi:type="string">catalogProductSimple::default</data> + <data name="tag" xsi:type="string">test_type:acceptance_test</data> + <constraint name="Magento\Review\Test\Constraint\AssertReviewCreationSuccessMessage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewIsAbsentOnProductPage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewForm" /> + <constraint name="Magento\Review\Test\Constraint\AssertSetApprovedProductReview" /> + <constraint name="Magento\Review\Test\Constraint\AssertReviewLinksIsPresentOnProductPage" /> + <constraint name="Magento\Review\Test\Constraint\AssertProductReviewOnProductPage" /> + </variation> + </testCase> </config> diff --git a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php index 1a3958a95c3..43e431fbbea 100644 --- a/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php +++ b/dev/tests/functional/tests/app/Magento/Tax/Test/Constraint/AssertTaxRateForm.php @@ -54,7 +54,7 @@ class AssertTaxRateForm extends AbstractConstraint * @param TaxRate $initialTaxRate * @return array */ - protected function prepareData(TaxRate $taxRate, TaxRate $initialTaxRate) + protected function prepareData(TaxRate $taxRate, TaxRate $initialTaxRate = null) { if ($initialTaxRate !== null) { $data = array_merge($initialTaxRate->getData(), $taxRate->getData()); diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php index 4556ab35a49..25f535527bb 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php @@ -16,6 +16,41 @@ use Magento\Mtf\Fixture\FixtureInterface; */ class UrlRewriteForm extends Form { + /** + * Get target path value for url rewrite fixture. + * + * @param FixtureInterface $fixture + * @return string|void + */ + protected function getTargetPath(FixtureInterface $fixture) + { + $data = $fixture->getData(); + if (empty($data['entity_type']) && empty($this->getData()['target_path']) && !isset($data['target_path'])) { + $entity = $fixture->getDataFieldConfig('target_path')['source']->getEntity(); + return $entity->hasData('identifier') + ? $entity->getIdentifier() + : $entity->getUrlKey() . '.html'; + } + } + + /** + * Fill visible fields on the form. + * + * @param array $data + * @param SimpleElement $context + * @retun void + */ + protected function fillFields(array $data, SimpleElement $context) + { + $mapping = $this->dataMapping($data); + foreach ($mapping as $field) { + $element = $this->getElement($context, $field); + if ($element->isVisible() && !$element->isDisabled()) { + $element->setValue($field['value']); + } + } + } + /** * Fill the root form. * @@ -31,12 +66,7 @@ class UrlRewriteForm extends Form ) { $context = ($element === null) ? $this->_rootElement : $element; $data = $fixture->getData(); - if (empty($data['entity_type']) && empty($this->getData()['target_path']) && !isset($data['target_path'])) { - $entity = $fixture->getDataFieldConfig('target_path')['source']->getEntity(); - $data['target_path'] = $entity->hasData('identifier') - ? $entity->getIdentifier() - : $entity->getUrlKey() . '.html'; - } + $data['target_path'] = $this->getTargetPath($fixture); foreach ($replace as $key => $value) { if (isset($data[$key])) { @@ -44,13 +74,7 @@ class UrlRewriteForm extends Form } } - $mapping = $this->dataMapping($data); - foreach ($mapping as $name => $field) { - $element = $this->getElement($context, $field); - if ($element->isVisible() && !$element->isDisabled()) { - $element->setValue($field['value']); - } - } + $this->fillFields($data, $context); return $this; } -- GitLab From f1b1c9836d0709f01ea3d174bb4c2525eb36b568 Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Fri, 19 Jun 2015 15:00:07 +0300 Subject: [PATCH 329/396] MAGETWO-38667: [UI] Assistance with applying new style for Gift Options - part 2 --- .../blank/Magento_GiftMessage/web/css/source/_module.less | 6 ------ .../luma/Magento_GiftMessage/web/css/source/_module.less | 6 ------ 2 files changed, 12 deletions(-) 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 81688c7737a..2d0e55d1620 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 @@ -126,15 +126,9 @@ .content { &:extend(.abs-add-clearfix all); .css(border-bottom, @gift-item-block__border-width solid @gift-item-block__border-color); - display: none; padding: @indent__s @indent__s @indent__base; position: relative; } - &._active { - .content { - display: block; - } - } } // 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 225b28b4fa3..0d3b4cd47ec 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 @@ -158,15 +158,9 @@ .content { &:extend(.abs-add-clearfix all); - display: none; padding: @indent__s 0 @indent__base; position: relative; } - &._active { - .content { - display: block; - } - } } // -- GitLab From f24daced137defd0ccb5f8093ac330e522f2b8bf Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 19 Jun 2015 15:22:45 +0300 Subject: [PATCH 330/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index db0420db09d..55b6819af5a 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -35,17 +35,17 @@ define([ /** * Initializes mixins assigned to a specfied component. * - * @param {Object} mixins - object contains mixins list. + * @param {Object} mixinList - object contains mixins list. * @param {Object} itemContainer - object with component config and DOM element link. */ - function initMixins(mixins, itemContainer){ + function initMixins(mixinList, itemContainer){ var configStack = {}, element = itemContainer.el; - _.each(mixins, function (mixin, componentName) { + _.each(mixinList, function (mixin, componentName) { configStack = itemContainer.data[componentName]; require(mixin, function(){ - for (var i = 0, l = arguments.length; i < l; i++){ + for (var i = 0, len = arguments.length; i < len; i++){ configStack = arguments[i](configStack, element); } -- GitLab From 7bfc174f0e93ba748c8d7119ba203bbba222c53b Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Fri, 19 Jun 2015 15:50:26 +0300 Subject: [PATCH 331/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index 55b6819af5a..704a3b93373 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -42,9 +42,9 @@ define([ var configStack = {}, element = itemContainer.el; - _.each(mixinList, function (mixin, componentName) { + _.each(mixinList, function (mixinArray, componentName) { configStack = itemContainer.data[componentName]; - require(mixin, function(){ + require(mixinArray, function(){ for (var i = 0, len = arguments.length; i < len; i++){ configStack = arguments[i](configStack, element); } -- GitLab From 65131527cadbd8dcd31ddd0c33e3bd8f04a588b6 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 19 Jun 2015 15:58:16 +0300 Subject: [PATCH 332/396] MAGETWO-38156: Move gift message to cart --- .../GiftMessage/view/frontend/web/template/gift-message.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index dbe0ee8c877..d93af0766c3 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -12,7 +12,7 @@ <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()"> + <div data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> <!-- ko ifnot: resultBlockVisibility() --> <div class="gift-options"> <!-- ko foreach: getRegion('additionalOptions') --> -- GitLab From 880be2c03c55bcf0a513c6b2c4a325759afcdb09 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 19 Jun 2015 16:11:24 +0300 Subject: [PATCH 333/396] MAGETWO-38155: Create block for order level --- .../testsuite/Magento/Framework/Composer/RemoveTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php index 17eaeb9c4eb..568e5a21e1d 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php @@ -18,6 +18,7 @@ class RemoveTest extends \PHPUnit_Framework_TestCase ->method('getPath') ->with(DirectoryList::CONFIG) ->willReturn(BP . '/app/etc'); + $composerApp->expects($this->once())->method('resetComposer'); $composerApp->expects($this->once())->method('setAutoExit')->with(false); $composerApp->expects($this->once())->method('run'); $remove = new Remove($composerApp, $directoryList); -- GitLab From 1154f035e8cc7f7a500ccd656dae4b5e2600db7a Mon Sep 17 00:00:00 2001 From: Alex Bomko <abomko@ebay.com> Date: Thu, 18 Jun 2015 18:14:49 +0300 Subject: [PATCH 334/396] MAGETWO-38946: Create pull request for a sprint 22 results - fix tests --- .../Magento/Email/Model/AbstractTemplate.php | 8 +++---- .../Magento/Email/Model/BackendTemplate.php | 4 ++-- app/code/Magento/Email/Model/Template.php | 23 +++++++++++++++---- .../Email/Test/Unit/Model/TemplateTest.php | 4 ++-- app/code/Magento/Newsletter/Model/Queue.php | 12 +++++----- .../Magento/Newsletter/Model/Template.php | 4 ++-- .../Test/Unit/Model/TemplateTest.php | 2 +- .../Test/Unit/Model/Email/TemplateTest.php | 20 ---------------- 8 files changed, 35 insertions(+), 42 deletions(-) diff --git a/app/code/Magento/Email/Model/AbstractTemplate.php b/app/code/Magento/Email/Model/AbstractTemplate.php index fba8e4c5fa9..4b92506e511 100644 --- a/app/code/Magento/Email/Model/AbstractTemplate.php +++ b/app/code/Magento/Email/Model/AbstractTemplate.php @@ -72,18 +72,18 @@ abstract class AbstractTemplate extends AbstractModel implements TemplateTypesIn * @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\Db $resourceCollection + * @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 = [], \Magento\Framework\Model\Resource\AbstractResource $resource = null, - \Magento\Framework\Data\Collection\Db $resourceCollection = null, - array $data = [] + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null ) { $this->_design = $design; $this->_area = isset($data['area']) ? $data['area'] : null; diff --git a/app/code/Magento/Email/Model/BackendTemplate.php b/app/code/Magento/Email/Model/BackendTemplate.php index c8bc6b34398..e9527840706 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 94d95910e12..30f8ae33f00 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, null, null, $data); + parent::__construct( + $context, + $registry, + $design, + $appEmulation, + $storeManager, + $data, + $resource, + $resourceCollection + ); } /** diff --git a/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php b/app/code/Magento/Email/Test/Unit/Model/TemplateTest.php index 47d4e8e0929..3c89c3a8532 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/Newsletter/Model/Queue.php b/app/code/Magento/Newsletter/Model/Queue.php index c55b9f1b462..3a42e4ac6e3 100644 --- a/app/code/Magento/Newsletter/Model/Queue.php +++ b/app/code/Magento/Newsletter/Model/Queue.php @@ -120,14 +120,14 @@ class Queue extends \Magento\Email\Model\AbstractTemplate * @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\Db $resourceCollection + * @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, @@ -137,18 +137,18 @@ class Queue extends \Magento\Email\Model\AbstractTemplate \Magento\Newsletter\Model\Resource\Subscriber\CollectionFactory $subscriberCollectionFactory, \Magento\Newsletter\Model\Queue\TransportBuilder $transportBuilder, \Magento\Framework\Model\Resource\AbstractResource $resource = null, - \Magento\Framework\Data\Collection\Db $resourceCollection = null, + \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [] ) { parent::__construct( $context, - $design, $registry, + $design, $appEmulation, $storeManager, + $data, $resource, - $resourceCollection, - $data + $resourceCollection ); $this->_templateFilter = $templateFilter; $this->_date = $date; diff --git a/app/code/Magento/Newsletter/Model/Template.php b/app/code/Magento/Newsletter/Model/Template.php index 215c5921574..9f439f71927 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, null, null, $data); + parent::__construct($context, $registry, $design, $appEmulation, $storeManager, $data); $this->_storeManager = $storeManager; $this->_request = $request; $this->_filter = $filter; diff --git a/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php b/app/code/Magento/Newsletter/Test/Unit/Model/TemplateTest.php index 1b599897715..0bbd428237b 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/Sales/Test/Unit/Model/Email/TemplateTest.php b/app/code/Magento/Sales/Test/Unit/Model/Email/TemplateTest.php index 37c29c2be22..b4f0e627ceb 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()) -- GitLab From 081685636020ee43a3e94707799fef28e082018e Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Fri, 19 Jun 2015 16:41:04 +0300 Subject: [PATCH 335/396] MAGETWO-38954: UnitTest Coverage Magento\Reports* --- .../Test/Unit/Model/Resource/EventTest.php | 1 - .../Test/Unit/Model/Resource/HelperTest.php | 1 - .../Model/Resource/Order/CollectionTest.php | 505 ++++++++++++++++++ 3 files changed, 505 insertions(+), 2 deletions(-) create mode 100644 app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php index 98aabc602cc..5d1dc3bbcea 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/EventTest.php @@ -70,7 +70,6 @@ class EventTest extends \PHPUnit_Framework_TestCase ->willReturn($this->storeMock); $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface') - ->disableOriginalConstructor() ->getMock(); $this->resourceMock = $this->getMockBuilder('Magento\Framework\App\Resource') diff --git a/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php index 55e09c7be83..fe0aef2871a 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php @@ -35,7 +35,6 @@ class HelperTest extends \PHPUnit_Framework_TestCase ->getMock(); $this->connectionMock = $this->getMockBuilder('Magento\Framework\DB\Adapter\AdapterInterface') - ->disableOriginalConstructor() ->getMock(); $this->resourceMock 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 00000000000..503b953068d --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php @@ -0,0 +1,505 @@ +<?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; + +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') + ->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] + ]; + } +} -- GitLab From 24165330b7007c1ba51809b03858cfc3f1ce6727 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 19 Jun 2015 16:59:04 +0300 Subject: [PATCH 336/396] MAGETWO-38155: Create block for order level --- .../testsuite/Magento/Framework/Composer/RemoveTest.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php index 568e5a21e1d..4d339f9ca7b 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/RemoveTest.php @@ -11,7 +11,13 @@ class RemoveTest extends \PHPUnit_Framework_TestCase { public function testRemove() { - $composerApp = $this->getMock('Composer\Console\Application', [], [], '', false); + $composerApp = $this->getMock( + 'Composer\Console\Application', + ['resetComposer', 'setAutoExit', 'run'], + [], + '', + false + ); $directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); $directoryList->expects($this->once())->method('getRoot'); $directoryList->expects($this->once()) -- GitLab From 8a5fec91df3d3f365b21284361f75f78251459ae Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 19 Jun 2015 17:29:43 +0300 Subject: [PATCH 337/396] MAGETWO-38155: Create block for order level --- .../Framework/Composer/Test/Unit/DependencyCheckerTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php b/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php index 75b6239c776..134ca85caac 100644 --- a/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php +++ b/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php @@ -30,6 +30,7 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase $buffer->writeln($output); } ); + $composerApp->expects($this->atLeastOnce())->method('resetComposer'); $dependencyChecker = new DependencyChecker($composerApp, $directoryList); $expected = [ -- GitLab From 2de4597dd575819ef14e7c3ff7ce3414a0c497e6 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 19 Jun 2015 17:55:14 +0300 Subject: [PATCH 338/396] MAGETWO-38155: Create block for order level --- .../Test/Unit/DependencyCheckerTest.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php b/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php index 134ca85caac..6ce7274d92d 100644 --- a/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php +++ b/lib/internal/Magento/Framework/Composer/Test/Unit/DependencyCheckerTest.php @@ -11,7 +11,13 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase { public function testCheckDependencies() { - $composerApp = $this->getMock('Composer\Console\Application', [], [], '', false); + $composerApp = $this->getMock( + 'Composer\Console\Application', + ['setAutoExit', 'run', 'resetComposer'], + [], + '', + false + ); $directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); $directoryList->expects($this->exactly(2))->method('getRoot'); $composerApp->expects($this->once())->method('setAutoExit')->with(false); @@ -45,7 +51,13 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase public function testCheckDependenciesExcludeSelf() { - $composerApp = $this->getMock('Composer\Console\Application', [], [], '', false); + $composerApp = $this->getMock( + 'Composer\Console\Application', + ['setAutoExit', 'run', 'resetComposer'], + [], + '', + false + ); $directoryList = $this->getMock('Magento\Framework\App\Filesystem\DirectoryList', [], [], '', false); $directoryList->expects($this->exactly(3))->method('getRoot'); $composerApp->expects($this->once())->method('setAutoExit')->with(false); @@ -70,6 +82,7 @@ class DependencyCheckerTest extends \PHPUnit_Framework_TestCase $buffer->writeln($output); } ); + $composerApp->expects($this->atLeastOnce())->method('resetComposer'); $dependencyChecker = new DependencyChecker($composerApp, $directoryList); $expected = [ -- GitLab From db17c80fcb4a1dc51d7e7f5ba4abe8f8b6a962bd Mon Sep 17 00:00:00 2001 From: Evgeniy Kolesov <ikolesov@ebay.com> Date: Fri, 19 Jun 2015 16:04:13 +0300 Subject: [PATCH 339/396] MAGETWO-33536: M2 GitHub Update (version 0.74.0-beta14) --- CHANGELOG.md | 39 ++++++++++++++ .../Magento/AdminNotification/composer.json | 10 ++-- app/code/Magento/Authorization/composer.json | 6 +-- app/code/Magento/Backend/composer.json | 36 ++++++------- app/code/Magento/Backup/composer.json | 10 ++-- app/code/Magento/Bundle/composer.json | 34 ++++++------ .../Magento/BundleImportExport/composer.json | 14 ++--- .../Magento/CacheInvalidate/composer.json | 6 +-- app/code/Magento/Captcha/composer.json | 14 ++--- app/code/Magento/Catalog/composer.json | 52 +++++++++---------- .../Magento/CatalogImportExport/composer.json | 22 ++++---- .../Magento/CatalogInventory/composer.json | 18 +++---- app/code/Magento/CatalogRule/composer.json | 20 +++---- app/code/Magento/CatalogSearch/composer.json | 22 ++++---- .../Magento/CatalogUrlRewrite/composer.json | 18 +++---- app/code/Magento/CatalogWidget/composer.json | 20 +++---- app/code/Magento/Checkout/composer.json | 42 +++++++-------- .../Magento/CheckoutAgreements/composer.json | 12 ++--- app/code/Magento/Cms/composer.json | 22 ++++---- app/code/Magento/CmsUrlRewrite/composer.json | 10 ++-- app/code/Magento/Config/composer.json | 16 +++--- .../ConfigurableImportExport/composer.json | 14 ++--- .../Magento/ConfigurableProduct/composer.json | 32 ++++++------ app/code/Magento/Contact/composer.json | 12 ++--- app/code/Magento/Cookie/composer.json | 8 +-- app/code/Magento/Cron/composer.json | 8 +-- app/code/Magento/CurrencySymbol/composer.json | 14 ++--- app/code/Magento/Customer/composer.json | 44 ++++++++-------- .../CustomerImportExport/composer.json | 16 +++--- app/code/Magento/DesignEditor/composer.json | 18 +++---- app/code/Magento/Developer/composer.json | 6 +-- app/code/Magento/Dhl/composer.json | 24 ++++----- app/code/Magento/Directory/composer.json | 10 ++-- app/code/Magento/Downloadable/composer.json | 38 +++++++------- app/code/Magento/Eav/composer.json | 14 ++--- app/code/Magento/Email/composer.json | 14 ++--- app/code/Magento/Fedex/composer.json | 20 +++---- app/code/Magento/GiftMessage/composer.json | 22 ++++---- app/code/Magento/GoogleAdwords/composer.json | 8 +-- .../Magento/GoogleAnalytics/composer.json | 10 ++-- .../Magento/GoogleOptimizer/composer.json | 14 ++--- app/code/Magento/GoogleShopping/composer.json | 18 +++---- .../Magento/GroupedImportExport/composer.json | 14 ++--- app/code/Magento/GroupedProduct/composer.json | 26 +++++----- app/code/Magento/ImportExport/composer.json | 14 ++--- app/code/Magento/Indexer/composer.json | 10 ++-- app/code/Magento/Integration/composer.json | 14 ++--- .../Magento/LayeredNavigation/composer.json | 8 +-- app/code/Magento/Log/composer.json | 12 ++--- app/code/Magento/MediaStorage/composer.json | 10 ++-- app/code/Magento/Msrp/composer.json | 20 +++---- app/code/Magento/Multishipping/composer.json | 20 +++---- app/code/Magento/Newsletter/composer.json | 22 ++++---- .../Magento/OfflinePayments/composer.json | 8 +-- .../Magento/OfflineShipping/composer.json | 24 ++++----- app/code/Magento/PageCache/composer.json | 10 ++-- app/code/Magento/Payment/composer.json | 14 ++--- app/code/Magento/Persistent/composer.json | 16 +++--- app/code/Magento/ProductAlert/composer.json | 10 ++-- app/code/Magento/Quote/composer.json | 34 ++++++------ app/code/Magento/Reports/composer.json | 38 +++++++------- app/code/Magento/RequireJs/composer.json | 4 +- app/code/Magento/Review/composer.json | 22 ++++---- app/code/Magento/Rss/composer.json | 10 ++-- app/code/Magento/Rule/composer.json | 12 ++--- app/code/Magento/Sales/composer.json | 52 +++++++++---------- app/code/Magento/SalesRule/composer.json | 34 ++++++------ app/code/Magento/SalesSequence/composer.json | 4 +- app/code/Magento/Search/composer.json | 12 ++--- app/code/Magento/SendFriend/composer.json | 12 ++--- app/code/Magento/Shipping/composer.json | 30 +++++------ app/code/Magento/Sitemap/composer.json | 18 +++---- app/code/Magento/Store/composer.json | 12 ++--- app/code/Magento/Tax/composer.json | 30 +++++------ .../Magento/TaxImportExport/composer.json | 12 ++--- app/code/Magento/Theme/composer.json | 24 ++++----- app/code/Magento/Translation/composer.json | 12 ++--- app/code/Magento/Ui/composer.json | 10 ++-- app/code/Magento/Ups/composer.json | 18 +++---- app/code/Magento/UrlRewrite/composer.json | 16 +++--- app/code/Magento/User/composer.json | 12 ++--- app/code/Magento/Usps/composer.json | 20 +++---- app/code/Magento/Variable/composer.json | 10 ++-- app/code/Magento/Version/composer.json | 4 +- app/code/Magento/Webapi/composer.json | 14 ++--- app/code/Magento/Weee/composer.json | 24 ++++----- app/code/Magento/Widget/composer.json | 16 +++--- app/code/Magento/Wishlist/composer.json | 34 ++++++------ .../adminhtml/Magento/backend/composer.json | 4 +- .../frontend/Magento/blank/composer.json | 4 +- .../frontend/Magento/luma/composer.json | 6 +-- app/i18n/magento/de_de/composer.json | 4 +- app/i18n/magento/en_us/composer.json | 4 +- app/i18n/magento/es_es/composer.json | 4 +- app/i18n/magento/fr_fr/composer.json | 4 +- app/i18n/magento/nl_nl/composer.json | 4 +- app/i18n/magento/pt_br/composer.json | 4 +- app/i18n/magento/zh_cn/composer.json | 4 +- composer.json | 2 +- composer.lock | 44 ++++++++-------- .../Magento/Framework/AppInterface.php | 2 +- lib/internal/Magento/Framework/composer.json | 2 +- 102 files changed, 870 insertions(+), 831 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fe6136eae1..a1d98332be0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,42 @@ +0.74.0-beta14 +============= +* Framework improvements: + * Introduced an ability to uninstall modules which were installed via composer (bin/magento module:uninstall <moduleName>) + * Introduced an ability to uninstall themes (bin/magento theme:uninstall <themeName>) + * Introduced an ability to backup and rollback DB and Media via CLI (bin/magento setup:backup, options are --code, --db or --media) + * Introduced an ability to uninstall language packages (bin/magento i18n:uninstall <languagePack>) + * Introduced API notation for the following modules: Backend, Backup, Cron, Log, PageCache + * Added join processors to search services, joined config for services with extension attributes + * Renamed hidden_tax to discount_tax_compensation + * The customer address entity table was transformed from EAV into a flat model to minimize database operations +* Fixed bugs: + * Fixed an issue where Setup Wizard failed on readiness check when Magento was deployed by composer create-project + * Fixed the local file path disclosure when trying to browse image cache directory + * Fixed an issue where development errors resulted in too many redirects + * Fixed an integration test failure in Reports ViewedTest + * Fixed an issue where it was impossible to save existent Grouped Product with no child items + * Fixed an issue where message "We don't have as many "conf1" as you requested" appeared + * Fixed an issue where second product from bundle product was ordered as separate item after checkout + * Fixed an issue where configs for payments and shippings were not encrypted + * Fixed an issue where Table Rates shipping method did not work + * Fixed an issue where admin could not set locale properly on Account page + * Fixed incomplete generated results of single tenant compiler + * Fixed an issue with full page caching where one set of prices was cached for all customers + * Fixed incorrect urls for private content + * Fixed an issue where it was not possible to assign a product link to another product using API + * Fixed an issue where zipcode was not displayed as required field on Create New Order page + * Fixed the Sample Data re-installation + * Fixed random fails on inventory tab for test CreateSimpleProductEntityTest +* Tests: + * Covered various modules with unit tests + * Functional tests fixed and maintained +* GitHub issues: + * [#1156](https://github.com/magento/magento2/pull/1156) -- Moves common code to all auto-generated Interceptor classes into a trait + * [#1206](https://github.com/magento/magento2/pull/1206) -- Allow modules to live outside of app/code directory + * [#1245](https://github.com/magento/magento2/pull/1245) -- Unable to save product per website wise + * [#1347](https://github.com/magento/magento2/pull/1347) -- Fixed failing Install during integration tests (MAGETWO-38482) + * [#1368](https://github.com/magento/magento2/pull/1368) -- Fix typo in getCurrentCategoryKey + 0.74.0-beta13 ============= * Framework improvements: diff --git a/app/code/Magento/AdminNotification/composer.json b/app/code/Magento/AdminNotification/composer.json index d26dfd73727..5ae1d3e4e20 100644 --- a/app/code/Magento/AdminNotification/composer.json +++ b/app/code/Magento/AdminNotification/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Authorization/composer.json b/app/code/Magento/Authorization/composer.json index 9225d004e7c..9ce77947a0b 100644 --- a/app/code/Magento/Authorization/composer.json +++ b/app/code/Magento/Authorization/composer.json @@ -3,12 +3,12 @@ "description": "Authorization module provides access to Magento ACL functionality.", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Backend/composer.json b/app/code/Magento/Backend/composer.json index b7e2b7bc15b..b2b20216cf6 100644 --- a/app/code/Magento/Backend/composer.json +++ b/app/code/Magento/Backend/composer.json @@ -3,27 +3,27 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-developer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-user": "0.74.0-beta13", - "magento/module-backup": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-translation": "0.74.0-beta13", - "magento/module-require-js": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-developer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-user": "0.74.0-beta14", + "magento/module-backup": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-translation": "0.74.0-beta14", + "magento/module-require-js": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Backup/composer.json b/app/code/Magento/Backup/composer.json index 30ca528748c..74b0a704e1d 100644 --- a/app/code/Magento/Backup/composer.json +++ b/app/code/Magento/Backup/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Bundle/composer.json b/app/code/Magento/Bundle/composer.json index ddc09411834..f3017a3a8dd 100644 --- a/app/code/Magento/Bundle/composer.json +++ b/app/code/Magento/Bundle/composer.json @@ -3,28 +3,28 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-gift-message": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-webapi": "0.74.0-beta13" + "magento/module-webapi": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/BundleImportExport/composer.json b/app/code/Magento/BundleImportExport/composer.json index ddbc85cb67c..78b23b0ff87 100755 --- a/app/code/Magento/BundleImportExport/composer.json +++ b/app/code/Magento/BundleImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-bundle": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-bundle": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CacheInvalidate/composer.json b/app/code/Magento/CacheInvalidate/composer.json index 5045f5b065c..5f5a8b2ce39 100644 --- a/app/code/Magento/CacheInvalidate/composer.json +++ b/app/code/Magento/CacheInvalidate/composer.json @@ -3,12 +3,12 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-page-cache": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-page-cache": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Captcha/composer.json b/app/code/Magento/Captcha/composer.json index 8e61f79ac76..044ade39edc 100644 --- a/app/code/Magento/Captcha/composer.json +++ b/app/code/Magento/Captcha/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Catalog/composer.json b/app/code/Magento/Catalog/composer.json index 2c1ac69b4bb..7c1d49431e2 100644 --- a/app/code/Magento/Catalog/composer.json +++ b/app/code/Magento/Catalog/composer.json @@ -3,37 +3,37 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-log": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-product-alert": "0.74.0-beta13", - "magento/module-url-rewrite": "0.74.0-beta13", - "magento/module-catalog-url-rewrite": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-log": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-product-alert": "0.74.0-beta14", + "magento/module-url-rewrite": "0.74.0-beta14", + "magento/module-catalog-url-rewrite": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogImportExport/composer.json b/app/code/Magento/CatalogImportExport/composer.json index fe82fc10d13..ca381cabc50 100644 --- a/app/code/Magento/CatalogImportExport/composer.json +++ b/app/code/Magento/CatalogImportExport/composer.json @@ -3,21 +3,21 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "ext-ctype": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogInventory/composer.json b/app/code/Magento/CatalogInventory/composer.json index 17807abf002..fa1c799fe73 100644 --- a/app/code/Magento/CatalogInventory/composer.json +++ b/app/code/Magento/CatalogInventory/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogRule/composer.json b/app/code/Magento/CatalogRule/composer.json index 3611281f1c6..539ca4af208 100644 --- a/app/code/Magento/CatalogRule/composer.json +++ b/app/code/Magento/CatalogRule/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-rule": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-rule": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogSearch/composer.json b/app/code/Magento/CatalogSearch/composer.json index 307467c3c62..1d8292288c1 100644 --- a/app/code/Magento/CatalogSearch/composer.json +++ b/app/code/Magento/CatalogSearch/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-search": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-search": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogUrlRewrite/composer.json b/app/code/Magento/CatalogUrlRewrite/composer.json index a4fdb35d556..764fb5ed8db 100644 --- a/app/code/Magento/CatalogUrlRewrite/composer.json +++ b/app/code/Magento/CatalogUrlRewrite/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-url-rewrite": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-url-rewrite": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CatalogWidget/composer.json b/app/code/Magento/CatalogWidget/composer.json index 633cc2a7cc4..a1708c5aa5d 100644 --- a/app/code/Magento/CatalogWidget/composer.json +++ b/app/code/Magento/CatalogWidget/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-rule": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-rule": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json index db8918bca76..7aac4e4eeb3 100644 --- a/app/code/Magento/Checkout/composer.json +++ b/app/code/Magento/Checkout/composer.json @@ -3,32 +3,32 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-gift-message": "0.74.0-beta14", + "magento/module-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", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CheckoutAgreements/composer.json b/app/code/Magento/CheckoutAgreements/composer.json index bea7e49ea19..28936c416e3 100644 --- a/app/code/Magento/CheckoutAgreements/composer.json +++ b/app/code/Magento/CheckoutAgreements/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Cms/composer.json b/app/code/Magento/Cms/composer.json index 73cbc55bc1d..74159635377 100644 --- a/app/code/Magento/Cms/composer.json +++ b/app/code/Magento/Cms/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-variable": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-variable": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CmsUrlRewrite/composer.json b/app/code/Magento/CmsUrlRewrite/composer.json index f469ccf9a8a..c5d23577dd3 100644 --- a/app/code/Magento/CmsUrlRewrite/composer.json +++ b/app/code/Magento/CmsUrlRewrite/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-url-rewrite": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-url-rewrite": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Config/composer.json b/app/code/Magento/Config/composer.json index 99e065fbf08..cc83e07515d 100644 --- a/app/code/Magento/Config/composer.json +++ b/app/code/Magento/Config/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ConfigurableImportExport/composer.json b/app/code/Magento/ConfigurableImportExport/composer.json index 54fb284e622..8d04a7bae07 100644 --- a/app/code/Magento/ConfigurableImportExport/composer.json +++ b/app/code/Magento/ConfigurableImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-configurable-product": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-configurable-product": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ConfigurableProduct/composer.json b/app/code/Magento/ConfigurableProduct/composer.json index a59d294e116..d67c88a3d95 100644 --- a/app/code/Magento/ConfigurableProduct/composer.json +++ b/app/code/Magento/ConfigurableProduct/composer.json @@ -3,27 +3,27 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-webapi": "0.74.0-beta13" + "magento/module-webapi": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Contact/composer.json b/app/code/Magento/Contact/composer.json index 855dc95f1b1..b439ea140c1 100644 --- a/app/code/Magento/Contact/composer.json +++ b/app/code/Magento/Contact/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Cookie/composer.json b/app/code/Magento/Cookie/composer.json index f407a5b8678..544fd07a9c3 100644 --- a/app/code/Magento/Cookie/composer.json +++ b/app/code/Magento/Cookie/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.4.11|~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-backend": "0.74.0-beta13" + "magento/module-backend": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Cron/composer.json b/app/code/Magento/Cron/composer.json index 2b1ebf6e958..6399fb6b9e9 100644 --- a/app/code/Magento/Cron/composer.json +++ b/app/code/Magento/Cron/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CurrencySymbol/composer.json b/app/code/Magento/CurrencySymbol/composer.json index 87a1ae6197a..84def1d3cbe 100644 --- a/app/code/Magento/CurrencySymbol/composer.json +++ b/app/code/Magento/CurrencySymbol/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Customer/composer.json b/app/code/Magento/Customer/composer.json index 69fc3efec38..0eece788e93 100644 --- a/app/code/Magento/Customer/composer.json +++ b/app/code/Magento/Customer/composer.json @@ -3,33 +3,33 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-newsletter": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-review": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-integration": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-newsletter": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-review": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-integration": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/CustomerImportExport/composer.json b/app/code/Magento/CustomerImportExport/composer.json index 0fca4e85cc1..b6a1e407f40 100644 --- a/app/code/Magento/CustomerImportExport/composer.json +++ b/app/code/Magento/CustomerImportExport/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/DesignEditor/composer.json b/app/code/Magento/DesignEditor/composer.json index c74e983baf4..b1da5a0bdcd 100644 --- a/app/code/Magento/DesignEditor/composer.json +++ b/app/code/Magento/DesignEditor/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-translation": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-translation": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Developer/composer.json b/app/code/Magento/Developer/composer.json index 159132b761c..a48bb010586 100644 --- a/app/code/Magento/Developer/composer.json +++ b/app/code/Magento/Developer/composer.json @@ -3,12 +3,12 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Dhl/composer.json b/app/code/Magento/Dhl/composer.json index 844caf08a5f..02b7d41aa6e 100644 --- a/app/code/Magento/Dhl/composer.json +++ b/app/code/Magento/Dhl/composer.json @@ -3,22 +3,22 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Directory/composer.json b/app/code/Magento/Directory/composer.json index bc48bec5995..23ab56ed5a4 100644 --- a/app/code/Magento/Directory/composer.json +++ b/app/code/Magento/Directory/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Downloadable/composer.json b/app/code/Magento/Downloadable/composer.json index 15f14f91214..fb54763027f 100644 --- a/app/code/Magento/Downloadable/composer.json +++ b/app/code/Magento/Downloadable/composer.json @@ -3,28 +3,28 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-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", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Eav/composer.json b/app/code/Magento/Eav/composer.json index 5f243b89862..27a79fab2f4 100644 --- a/app/code/Magento/Eav/composer.json +++ b/app/code/Magento/Eav/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Email/composer.json b/app/code/Magento/Email/composer.json index e1be936adc0..337caab036b 100644 --- a/app/code/Magento/Email/composer.json +++ b/app/code/Magento/Email/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-variable": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-variable": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Fedex/composer.json b/app/code/Magento/Fedex/composer.json index 2fe10a64063..63f7f335ce9 100644 --- a/app/code/Magento/Fedex/composer.json +++ b/app/code/Magento/Fedex/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GiftMessage/composer.json b/app/code/Magento/GiftMessage/composer.json index 2e2e4b6a8e4..6159ad811b2 100644 --- a/app/code/Magento/GiftMessage/composer.json +++ b/app/code/Magento/GiftMessage/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-multishipping": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-multishipping": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GoogleAdwords/composer.json b/app/code/Magento/GoogleAdwords/composer.json index 304cc1bf791..5cc77002b47 100644 --- a/app/code/Magento/GoogleAdwords/composer.json +++ b/app/code/Magento/GoogleAdwords/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GoogleAnalytics/composer.json b/app/code/Magento/GoogleAnalytics/composer.json index 92aee5dbd02..09c1724be6b 100644 --- a/app/code/Magento/GoogleAnalytics/composer.json +++ b/app/code/Magento/GoogleAnalytics/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-cookie": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-cookie": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GoogleOptimizer/composer.json b/app/code/Magento/GoogleOptimizer/composer.json index f046d154cbc..97573703a09 100644 --- a/app/code/Magento/GoogleOptimizer/composer.json +++ b/app/code/Magento/GoogleOptimizer/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-google-analytics": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-google-analytics": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GoogleShopping/composer.json b/app/code/Magento/GoogleShopping/composer.json index 564c50bd7a9..1e238779921 100644 --- a/app/code/Magento/GoogleShopping/composer.json +++ b/app/code/Magento/GoogleShopping/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GroupedImportExport/composer.json b/app/code/Magento/GroupedImportExport/composer.json index d17ec6ec9e8..33a57b24cb7 100644 --- a/app/code/Magento/GroupedImportExport/composer.json +++ b/app/code/Magento/GroupedImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-grouped-product": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-grouped-product": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/GroupedProduct/composer.json b/app/code/Magento/GroupedProduct/composer.json index d108bccbced..4ee6e8762d9 100644 --- a/app/code/Magento/GroupedProduct/composer.json +++ b/app/code/Magento/GroupedProduct/composer.json @@ -3,22 +3,22 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/module-msrp": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/module-msrp": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ImportExport/composer.json b/app/code/Magento/ImportExport/composer.json index e7cbb957d07..e5e58f1eeb8 100644 --- a/app/code/Magento/ImportExport/composer.json +++ b/app/code/Magento/ImportExport/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-indexer": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-indexer": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "ext-ctype": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Indexer/composer.json b/app/code/Magento/Indexer/composer.json index 5334b4ad74b..5c2d70fd3ba 100644 --- a/app/code/Magento/Indexer/composer.json +++ b/app/code/Magento/Indexer/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Integration/composer.json b/app/code/Magento/Integration/composer.json index e7522cbdd35..71e7696d8ef 100644 --- a/app/code/Magento/Integration/composer.json +++ b/app/code/Magento/Integration/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-user": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-user": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/LayeredNavigation/composer.json b/app/code/Magento/LayeredNavigation/composer.json index bdc20c0270c..5fb0f54db60 100644 --- a/app/code/Magento/LayeredNavigation/composer.json +++ b/app/code/Magento/LayeredNavigation/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Log/composer.json b/app/code/Magento/Log/composer.json index 1e5b22c2732..226458dacc1 100644 --- a/app/code/Magento/Log/composer.json +++ b/app/code/Magento/Log/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/MediaStorage/composer.json b/app/code/Magento/MediaStorage/composer.json index d6eb3484a39..da20bf9f3dc 100644 --- a/app/code/Magento/MediaStorage/composer.json +++ b/app/code/Magento/MediaStorage/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Msrp/composer.json b/app/code/Magento/Msrp/composer.json index 264b8eb51db..552af5d5da3 100644 --- a/app/code/Magento/Msrp/composer.json +++ b/app/code/Magento/Msrp/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-bundle": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-downloadable": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-grouped-product": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-bundle": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-downloadable": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-grouped-product": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Multishipping/composer.json b/app/code/Magento/Multishipping/composer.json index 1d8a0325c2e..3f6d9e22a13 100644 --- a/app/code/Magento/Multishipping/composer.json +++ b/app/code/Magento/Multishipping/composer.json @@ -3,19 +3,19 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Newsletter/composer.json b/app/code/Magento/Newsletter/composer.json index 5e9806a6fab..1ac1fb8c9d9 100644 --- a/app/code/Magento/Newsletter/composer.json +++ b/app/code/Magento/Newsletter/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-require-js": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-require-js": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/OfflinePayments/composer.json b/app/code/Magento/OfflinePayments/composer.json index 90045a9378f..5118d798b7e 100644 --- a/app/code/Magento/OfflinePayments/composer.json +++ b/app/code/Magento/OfflinePayments/composer.json @@ -3,13 +3,13 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/OfflineShipping/composer.json b/app/code/Magento/OfflineShipping/composer.json index 9e6c4caa47f..5a4bc6de203 100644 --- a/app/code/Magento/OfflineShipping/composer.json +++ b/app/code/Magento/OfflineShipping/composer.json @@ -3,21 +3,21 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-sales-rule": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-sales-rule": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/PageCache/composer.json b/app/code/Magento/PageCache/composer.json index bc812b12e6d..ce7896f5095 100644 --- a/app/code/Magento/PageCache/composer.json +++ b/app/code/Magento/PageCache/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Payment/composer.json b/app/code/Magento/Payment/composer.json index 87f3a9ef1cd..b78f45d7890 100644 --- a/app/code/Magento/Payment/composer.json +++ b/app/code/Magento/Payment/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Persistent/composer.json b/app/code/Magento/Persistent/composer.json index 379f16a66b2..b81c38561e3 100644 --- a/app/code/Magento/Persistent/composer.json +++ b/app/code/Magento/Persistent/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-cron": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-cron": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/ProductAlert/composer.json b/app/code/Magento/ProductAlert/composer.json index 3e993546d08..715f9607506 100644 --- a/app/code/Magento/ProductAlert/composer.json +++ b/app/code/Magento/ProductAlert/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Quote/composer.json b/app/code/Magento/Quote/composer.json index f5833130861..05d09f86f70 100644 --- a/app/code/Magento/Quote/composer.json +++ b/app/code/Magento/Quote/composer.json @@ -3,26 +3,26 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-sales-sequence": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-sales-sequence": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Reports/composer.json b/app/code/Magento/Reports/composer.json index 099550f07e1..89ac5cea8d6 100644 --- a/app/code/Magento/Reports/composer.json +++ b/app/code/Magento/Reports/composer.json @@ -3,28 +3,28 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-log": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-review": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-downloadable": "0.74.0-beta13", - "magento/module-sales-rule": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-log": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-review": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-downloadable": "0.74.0-beta14", + "magento/module-sales-rule": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/RequireJs/composer.json b/app/code/Magento/RequireJs/composer.json index c921a04022f..f36ff58438c 100644 --- a/app/code/Magento/RequireJs/composer.json +++ b/app/code/Magento/RequireJs/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Review/composer.json b/app/code/Magento/Review/composer.json index 45201df67e9..b8bb07beb0f 100644 --- a/app/code/Magento/Review/composer.json +++ b/app/code/Magento/Review/composer.json @@ -3,22 +3,22 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-newsletter": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-newsletter": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-cookie": "0.74.0-beta13" + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Rss/composer.json b/app/code/Magento/Rss/composer.json index 9e085b96770..ca4231a1f2e 100644 --- a/app/code/Magento/Rss/composer.json +++ b/app/code/Magento/Rss/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Rule/composer.json b/app/code/Magento/Rule/composer.json index d6e66b999c8..5d0a656ebc0 100644 --- a/app/code/Magento/Rule/composer.json +++ b/app/code/Magento/Rule/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Sales/composer.json b/app/code/Magento/Sales/composer.json index 7f07de89e05..e9850b28b5e 100644 --- a/app/code/Magento/Sales/composer.json +++ b/app/code/Magento/Sales/composer.json @@ -3,35 +3,35 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-sales-rule": "0.74.0-beta13", - "magento/module-sales-sequence": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-gift-message": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-wishlist": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-sales-rule": "0.74.0-beta14", + "magento/module-sales-sequence": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-gift-message": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-wishlist": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/SalesRule/composer.json b/app/code/Magento/SalesRule/composer.json index 73ca3c6e1d8..e842b73e7b2 100644 --- a/app/code/Magento/SalesRule/composer.json +++ b/app/code/Magento/SalesRule/composer.json @@ -3,26 +3,26 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-rule": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-catalog-rule": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-rule": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-catalog-rule": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/SalesSequence/composer.json b/app/code/Magento/SalesSequence/composer.json index 15ce9855deb..825a8e16713 100644 --- a/app/code/Magento/SalesSequence/composer.json +++ b/app/code/Magento/SalesSequence/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Search/composer.json b/app/code/Magento/Search/composer.json index d0eea2c18d8..98e1ce97eda 100644 --- a/app/code/Magento/Search/composer.json +++ b/app/code/Magento/Search/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog-search": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog-search": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/SendFriend/composer.json b/app/code/Magento/SendFriend/composer.json index f8e2a4f6875..b6712222a0c 100644 --- a/app/code/Magento/SendFriend/composer.json +++ b/app/code/Magento/SendFriend/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Shipping/composer.json b/app/code/Magento/Shipping/composer.json index 1960a285405..26e8e039f88 100644 --- a/app/code/Magento/Shipping/composer.json +++ b/app/code/Magento/Shipping/composer.json @@ -3,27 +3,27 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-contact": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-payment": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-contact": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-payment": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "ext-gd": "*", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-fedex": "0.74.0-beta13", - "magento/module-ups": "0.74.0-beta13" + "magento/module-fedex": "0.74.0-beta14", + "magento/module-ups": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Sitemap/composer.json b/app/code/Magento/Sitemap/composer.json index 7c7137e8db8..6e9cd7ca7d1 100644 --- a/app/code/Magento/Sitemap/composer.json +++ b/app/code/Magento/Sitemap/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog-url-rewrite": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog-url-rewrite": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Store/composer.json b/app/code/Magento/Store/composer.json index e8a224d7a44..3bb80c7c21e 100644 --- a/app/code/Magento/Store/composer.json +++ b/app/code/Magento/Store/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-directory": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-directory": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Tax/composer.json b/app/code/Magento/Tax/composer.json index 3ef7c5e73fc..b2d4d6faad7 100644 --- a/app/code/Magento/Tax/composer.json +++ b/app/code/Magento/Tax/composer.json @@ -3,24 +3,24 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-config": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-reports": "0.74.0-beta13", - "magento/module-page-cache": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-config": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-reports": "0.74.0-beta14", + "magento/module-page-cache": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/TaxImportExport/composer.json b/app/code/Magento/TaxImportExport/composer.json index 0cebf5d7d33..2642b858793 100644 --- a/app/code/Magento/TaxImportExport/composer.json +++ b/app/code/Magento/TaxImportExport/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-tax": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-tax": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Theme/composer.json b/app/code/Magento/Theme/composer.json index 7e2129cc460..9fbb0bd754d 100644 --- a/app/code/Magento/Theme/composer.json +++ b/app/code/Magento/Theme/composer.json @@ -3,23 +3,23 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-widget": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/module-media-storage": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-require-js": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-widget": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/module-media-storage": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-require-js": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-translation": "0.74.0-beta13" + "magento/module-translation": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Translation/composer.json b/app/code/Magento/Translation/composer.json index 05ce2874e8b..7de19b36d8a 100644 --- a/app/code/Magento/Translation/composer.json +++ b/app/code/Magento/Translation/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/module-developer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/module-developer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Ui/composer.json b/app/code/Magento/Ui/composer.json index edb3157e7aa..35d8c625925 100644 --- a/app/code/Magento/Ui/composer.json +++ b/app/code/Magento/Ui/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Ups/composer.json b/app/code/Magento/Ups/composer.json index 29ec2510c07..871fbcdc12c 100644 --- a/app/code/Magento/Ups/composer.json +++ b/app/code/Magento/Ups/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/UrlRewrite/composer.json b/app/code/Magento/UrlRewrite/composer.json index 91f18fbea47..24a2772e11a 100644 --- a/app/code/Magento/UrlRewrite/composer.json +++ b/app/code/Magento/UrlRewrite/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog-url-rewrite": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-cms-url-rewrite": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog-url-rewrite": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-cms-url-rewrite": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/User/composer.json b/app/code/Magento/User/composer.json index 82c4b5609f4..b16f88f04a4 100644 --- a/app/code/Magento/User/composer.json +++ b/app/code/Magento/User/composer.json @@ -3,15 +3,15 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-integration": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-integration": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Usps/composer.json b/app/code/Magento/Usps/composer.json index 625a904edd6..59b75138b5b 100644 --- a/app/code/Magento/Usps/composer.json +++ b/app/code/Magento/Usps/composer.json @@ -3,20 +3,20 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-shipping": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-config": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-shipping": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-config": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "lib-libxml": "*", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Variable/composer.json b/app/code/Magento/Variable/composer.json index b61f8fe802c..58eb8dbd4b6 100644 --- a/app/code/Magento/Variable/composer.json +++ b/app/code/Magento/Variable/composer.json @@ -3,14 +3,14 @@ "description": "N/A", "require": { "php": "~5.4.11|~5.5.0|~5.6.0", - "magento/module-backend": "0.74.0-beta13", - "magento/module-email": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-backend": "0.74.0-beta14", + "magento/module-email": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Version/composer.json b/app/code/Magento/Version/composer.json index 4a3025af599..07feda54cfd 100644 --- a/app/code/Magento/Version/composer.json +++ b/app/code/Magento/Version/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Webapi/composer.json b/app/code/Magento/Webapi/composer.json index 94d5b769e85..7c018de1b3b 100644 --- a/app/code/Magento/Webapi/composer.json +++ b/app/code/Magento/Webapi/composer.json @@ -3,18 +3,18 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-authorization": "0.74.0-beta13", - "magento/module-integration": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-authorization": "0.74.0-beta14", + "magento/module-integration": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-user": "0.74.0-beta13" + "magento/module-user": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Weee/composer.json b/app/code/Magento/Weee/composer.json index ba0a615bab1..7102e797d03 100644 --- a/app/code/Magento/Weee/composer.json +++ b/app/code/Magento/Weee/composer.json @@ -3,21 +3,21 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-tax": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-directory": "0.74.0-beta13", - "magento/module-eav": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-quote": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-tax": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-directory": "0.74.0-beta14", + "magento/module-eav": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-quote": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Widget/composer.json b/app/code/Magento/Widget/composer.json index cfecd20e99f..53ed15c7b6f 100644 --- a/app/code/Magento/Widget/composer.json +++ b/app/code/Magento/Widget/composer.json @@ -3,17 +3,17 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-cms": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-variable": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-cms": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-variable": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/code/Magento/Wishlist/composer.json b/app/code/Magento/Wishlist/composer.json index 703058cbf5f..31d183b64bb 100644 --- a/app/code/Magento/Wishlist/composer.json +++ b/app/code/Magento/Wishlist/composer.json @@ -3,28 +3,28 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-store": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-checkout": "0.74.0-beta13", - "magento/module-theme": "0.74.0-beta13", - "magento/module-catalog-inventory": "0.74.0-beta13", - "magento/module-rss": "0.74.0-beta13", - "magento/module-backend": "0.74.0-beta13", - "magento/module-sales": "0.74.0-beta13", - "magento/module-grouped-product": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", - "magento/module-ui": "0.74.0-beta13", + "magento/module-store": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-checkout": "0.74.0-beta14", + "magento/module-theme": "0.74.0-beta14", + "magento/module-catalog-inventory": "0.74.0-beta14", + "magento/module-rss": "0.74.0-beta14", + "magento/module-backend": "0.74.0-beta14", + "magento/module-sales": "0.74.0-beta14", + "magento/module-grouped-product": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", + "magento/module-ui": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "suggest": { - "magento/module-configurable-product": "0.74.0-beta13", - "magento/module-downloadable": "0.74.0-beta13", - "magento/module-bundle": "0.74.0-beta13", - "magento/module-cookie": "0.74.0-beta13" + "magento/module-configurable-product": "0.74.0-beta14", + "magento/module-downloadable": "0.74.0-beta14", + "magento/module-bundle": "0.74.0-beta14", + "magento/module-cookie": "0.74.0-beta14" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/design/adminhtml/Magento/backend/composer.json b/app/design/adminhtml/Magento/backend/composer.json index 58fbb8be56c..a635d2f6368 100644 --- a/app/design/adminhtml/Magento/backend/composer.json +++ b/app/design/adminhtml/Magento/backend/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-theme", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/design/frontend/Magento/blank/composer.json b/app/design/frontend/Magento/blank/composer.json index ed12dd50070..e715b5304c3 100644 --- a/app/design/frontend/Magento/blank/composer.json +++ b/app/design/frontend/Magento/blank/composer.json @@ -3,11 +3,11 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-theme", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/design/frontend/Magento/luma/composer.json b/app/design/frontend/Magento/luma/composer.json index 84cbda7b1c9..011484f9abf 100644 --- a/app/design/frontend/Magento/luma/composer.json +++ b/app/design/frontend/Magento/luma/composer.json @@ -3,12 +3,12 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/theme-frontend-blank": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/theme-frontend-blank": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-theme", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/app/i18n/magento/de_de/composer.json b/app/i18n/magento/de_de/composer.json index 8792a746870..752d5584e51 100644 --- a/app/i18n/magento/de_de/composer.json +++ b/app/i18n/magento/de_de/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-de_de", "description": "German (Germany) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/en_us/composer.json b/app/i18n/magento/en_us/composer.json index 12f592f50bc..4feb2ced23f 100644 --- a/app/i18n/magento/en_us/composer.json +++ b/app/i18n/magento/en_us/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-en_us", "description": "English (United States) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/es_es/composer.json b/app/i18n/magento/es_es/composer.json index eec09e8483f..c2a70d39bab 100644 --- a/app/i18n/magento/es_es/composer.json +++ b/app/i18n/magento/es_es/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-es_es", "description": "Spanish (Spain) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/fr_fr/composer.json b/app/i18n/magento/fr_fr/composer.json index 7ff13b7e8f3..b6c40d9c8fa 100644 --- a/app/i18n/magento/fr_fr/composer.json +++ b/app/i18n/magento/fr_fr/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-fr_fr", "description": "French (France) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/nl_nl/composer.json b/app/i18n/magento/nl_nl/composer.json index af92cc0e22f..c905b708215 100644 --- a/app/i18n/magento/nl_nl/composer.json +++ b/app/i18n/magento/nl_nl/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-nl_nl", "description": "Dutch (Netherlands) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/pt_br/composer.json b/app/i18n/magento/pt_br/composer.json index ea475dfb762..4f80afff03c 100644 --- a/app/i18n/magento/pt_br/composer.json +++ b/app/i18n/magento/pt_br/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-pt_br", "description": "Portuguese (Brazil) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/app/i18n/magento/zh_cn/composer.json b/app/i18n/magento/zh_cn/composer.json index fe43b44fcdc..63c14d0af90 100644 --- a/app/i18n/magento/zh_cn/composer.json +++ b/app/i18n/magento/zh_cn/composer.json @@ -1,13 +1,13 @@ { "name": "magento/language-zh_cn", "description": "Chinese (China) language", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { - "magento/framework": "0.74.0-beta13", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-language", diff --git a/composer.json b/composer.json index a62e8ac4890..0a4b438652c 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2ce", "description": "Magento 2 (Community Edition)", "type": "project", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" diff --git a/composer.lock b/composer.lock index beefd078b4a..6aed4aac94a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "a62e70bed8efa22bebb0fedf63b51925", + "hash": "ac6f08eaeb2344e2e395e7bd094a8d10", "packages": [ { "name": "composer/composer", @@ -49,7 +49,7 @@ "Composer": "src/" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -261,7 +261,7 @@ "ZF1", "framework" ], - "time": "2015-06-02 08:04:41" + "time": "2015-02-06 17:25:45" }, { "name": "monolog/monolog", @@ -567,7 +567,7 @@ "Symfony\\Component\\Finder\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -616,7 +616,7 @@ "Symfony\\Component\\Process\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -2347,16 +2347,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "2.1.5", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e" + "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be2286cb8c7e1773eded49d9719219e6f74f9e3e", - "reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44", + "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44", "shasum": "" }, "require": { @@ -2405,7 +2405,7 @@ "testing", "xunit" ], - "time": "2015-06-09 13:05:42" + "time": "2015-06-19 07:11:55" }, { "name": "phpunit/php-file-iterator", @@ -2539,16 +2539,16 @@ }, { "name": "phpunit/php-token-stream", - "version": "1.4.2", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "db63be1159c81df649cd0260e30249a586d4129e" + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db63be1159c81df649cd0260e30249a586d4129e", - "reference": "db63be1159c81df649cd0260e30249a586d4129e", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9", + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", "shasum": "" }, "require": { @@ -2584,7 +2584,7 @@ "keywords": [ "tokenizer" ], - "time": "2015-06-12 07:34:24" + "time": "2015-06-19 03:43:16" }, { "name": "phpunit/phpunit", @@ -2696,7 +2696,7 @@ "src/" ] }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "BSD-3-Clause" ], @@ -3195,7 +3195,7 @@ "Symfony\\Component\\Config\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3255,7 +3255,7 @@ "Symfony\\Component\\DependencyInjection\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3313,7 +3313,7 @@ "Symfony\\Component\\EventDispatcher\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3362,7 +3362,7 @@ "Symfony\\Component\\Filesystem\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3411,7 +3411,7 @@ "Symfony\\Component\\Stopwatch\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], @@ -3460,7 +3460,7 @@ "Symfony\\Component\\Yaml\\": "" } }, - "notification-url": "https://packagist.org/downloads/", + "notification-url": "http://packagist.org/downloads/", "license": [ "MIT" ], diff --git a/lib/internal/Magento/Framework/AppInterface.php b/lib/internal/Magento/Framework/AppInterface.php index b0b03dfcb47..fb61d6803b3 100644 --- a/lib/internal/Magento/Framework/AppInterface.php +++ b/lib/internal/Magento/Framework/AppInterface.php @@ -17,7 +17,7 @@ interface AppInterface /** * Magento version */ - const VERSION = '0.74.0-beta13'; + const VERSION = '0.74.0-beta14'; /** * Launch application diff --git a/lib/internal/Magento/Framework/composer.json b/lib/internal/Magento/Framework/composer.json index 1307d010016..29ca6222b30 100644 --- a/lib/internal/Magento/Framework/composer.json +++ b/lib/internal/Magento/Framework/composer.json @@ -2,7 +2,7 @@ "name": "magento/framework", "description": "N/A", "type": "magento2-library", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" -- GitLab From 7f2e8eb830117bff1ba4b61ab32bd1b06ef3849a Mon Sep 17 00:00:00 2001 From: Maddy Chellathurai <mchellathura@ebay.com> Date: Fri, 19 Jun 2015 10:05:25 -0500 Subject: [PATCH 340/396] MAGETWO-39005: Web-setup wizard and Composer install do not check for mbstring as required library - added dependency on mbstring --- composer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/composer.json b/composer.json index a62e8ac4890..85f8b7f089a 100644 --- a/composer.json +++ b/composer.json @@ -55,6 +55,7 @@ "ext-iconv": "*", "ext-intl": "*", "ext-xsl": "*", + "ext-mbstring": "*", "sjparkinson/static-review": "~4.1", "fabpot/php-cs-fixer": "~1.2", "lusitanian/oauth": "~0.3" -- GitLab From ffe42a4c2f8f19af5c3f7b38203a0ead60818f39 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Fri, 19 Jun 2015 18:11:33 +0300 Subject: [PATCH 341/396] MAGETWO-38156: Move gift message to cart --- .../view/frontend/web/js/model/gift-message.js | 9 --------- 1 file changed, 9 deletions(-) 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 58122cdd177..eec30f4e610 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 @@ -61,15 +61,6 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], : null; }, reset: function() { - var self = this; - _.each(this.observables[this.id], function(key) { - provider[self.getUniqueKey(self.id, key)](null); - }); - _.each(this.additionalOptions, function(option) { - if (_.isFunction(option.reset)) { - option.reset(); - } - }); this.getObservable('isClear')(true); }, getAfterSubmitCallbacks: function() { -- GitLab From 4a80c8d6e9de4c0fbe8fbba06ed35a9f1b5a3d8a Mon Sep 17 00:00:00 2001 From: Oleg Zinoviev <ozinoviev@ebay.com> Date: Fri, 19 Jun 2015 18:56:58 +0300 Subject: [PATCH 342/396] MAGETWO-37124: All text fields are invisible in Backend Add New Customer page - CR update --- .../Magento/backend/web/css/source/variables/_actions.less | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 9cb67832d16..c48a7d35828 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) - .2rem) / 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; -- GitLab From 40e0a7b2876f2cd30a9b11043480335a29b17e67 Mon Sep 17 00:00:00 2001 From: Alex Bomko <abomko@ebay.com> Date: Fri, 19 Jun 2015 19:04:33 +0300 Subject: [PATCH 343/396] MAGETWO-38946: Create pull request for a sprint 22 results --- .../CatalogInventory/Api/StockItemTest.php | 15 ++++++++++++--- .../Magento/Email/Model/TemplateTest.php | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) 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 f8ef77f8e29..0f49b8bef0a 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/integration/testsuite/Magento/Email/Model/TemplateTest.php b/dev/tests/integration/testsuite/Magento/Email/Model/TemplateTest.php index 70d92a6e3a0..16e47b8b867 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'), -- GitLab From ff7c06d1ce06c85c4412114ad2b1b70fc0d3996d Mon Sep 17 00:00:00 2001 From: Maddy Chellathurai <mchellathura@ebay.com> Date: Fri, 19 Jun 2015 11:27:08 -0500 Subject: [PATCH 344/396] MAGETWO-39005: Web-setup wizard and Composer install do not check for mbstring as required library - updated composer.lock --- composer.lock | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/composer.lock b/composer.lock index beefd078b4a..84e61ff1eb9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "a62e70bed8efa22bebb0fedf63b51925", + "hash": "215a87d2b4a8fc6280c1e05ea6eff1a1", "packages": [ { "name": "composer/composer", @@ -2347,16 +2347,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "2.1.5", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e" + "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be2286cb8c7e1773eded49d9719219e6f74f9e3e", - "reference": "be2286cb8c7e1773eded49d9719219e6f74f9e3e", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44", + "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44", "shasum": "" }, "require": { @@ -2405,7 +2405,7 @@ "testing", "xunit" ], - "time": "2015-06-09 13:05:42" + "time": "2015-06-19 07:11:55" }, { "name": "phpunit/php-file-iterator", @@ -2539,16 +2539,16 @@ }, { "name": "phpunit/php-token-stream", - "version": "1.4.2", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "db63be1159c81df649cd0260e30249a586d4129e" + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db63be1159c81df649cd0260e30249a586d4129e", - "reference": "db63be1159c81df649cd0260e30249a586d4129e", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9", + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", "shasum": "" }, "require": { @@ -2584,7 +2584,7 @@ "keywords": [ "tokenizer" ], - "time": "2015-06-12 07:34:24" + "time": "2015-06-19 03:43:16" }, { "name": "phpunit/phpunit", @@ -3502,6 +3502,7 @@ "ext-curl": "*", "ext-iconv": "*", "ext-intl": "*", - "ext-xsl": "*" + "ext-xsl": "*", + "ext-mbstring": "*" } } -- GitLab From 749c58f988deb10a8c51bd945555fe51df7f10bc Mon Sep 17 00:00:00 2001 From: Sergey Semenov <ssemenov@ebay.com> Date: Fri, 19 Jun 2015 22:12:05 +0300 Subject: [PATCH 345/396] MAGETWO-38969: It's unable to specify all values of "Multiple Select" Product Custom Option to purchase --- .../Magento/Catalog/Block/Product/View/Options/Type/Select.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7da80121645..cedd7b1f845 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) { -- GitLab From 9fa7896c77ee97da70bbb368989a54e3dbb7ec2f Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Fri, 19 Jun 2015 17:42:17 -0500 Subject: [PATCH 346/396] MAGETWO-16192: Security: Clickjacking solution - introduce X-Frame-Options - change default and backend permission to SAMEORIGIN --- app/code/Magento/Store/etc/di.xml | 4 ---- app/etc/di.xml | 3 +++ .../Magento/Framework/App/Response/XFrameOptPlugin.php | 4 ++-- .../Magento/Framework/App/Test/Unit/Response/HttpTest.php | 2 +- setup/src/Magento/Setup/Model/ConfigGenerator.php | 2 +- .../src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/code/Magento/Store/etc/di.xml b/app/code/Magento/Store/etc/di.xml index a1f8ad99744..320253c316b 100644 --- a/app/code/Magento/Store/etc/di.xml +++ b/app/code/Magento/Store/etc/di.xml @@ -296,8 +296,4 @@ </argument> </arguments> </type> - <type name="Magento\Framework\App\Response\Http"> - <plugin name="xFrameOptionsHeader" type="Magento\Framework\App\Response\XFrameOptPlugin"/> - </type> - </config> diff --git a/app/etc/di.xml b/app/etc/di.xml index c039f023bd6..0f1149cd7ac 100644 --- a/app/etc/di.xml +++ b/app/etc/di.xml @@ -136,6 +136,9 @@ <preference for="Magento\Framework\Api\ImageContentValidatorInterface" type="Magento\Framework\Api\ImageContentValidator" /> <preference for="Magento\Framework\Api\ImageProcessorInterface" type="Magento\Framework\Api\ImageProcessor" /> <preference for="Magento\Framework\Code\Reader\ClassReaderInterface" type="Magento\Framework\Code\Reader\ClassReader" /> + <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> diff --git a/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php b/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php index 1bae23efcb0..a108b754893 100644 --- a/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php +++ b/lib/internal/Magento/Framework/App/Response/XFrameOptPlugin.php @@ -14,8 +14,8 @@ class XFrameOptPlugin /** Deployment config key for frontend x-frame-options header value */ const DEPLOYMENT_CONFIG_X_FRAME_OPT = 'x-frame-options'; - /** Always send DENY in backend x-frame-options header */ - const BACKEND_X_FRAME_OPT = 'DENY'; + /** Always send SAMEORIGIN in backend x-frame-options header */ + const BACKEND_X_FRAME_OPT = 'SAMEORIGIN'; /** *The header value 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 7bacd6ea6fe..bcc51a53e3e 100644 --- a/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php +++ b/lib/internal/Magento/Framework/App/Test/Unit/Response/HttpTest.php @@ -274,7 +274,7 @@ class HttpTest extends \PHPUnit_Framework_TestCase public function testSetXFrameOptions() { - $value = 'SAMEORIGIN'; + $value = 'DENY'; $this->model->setXFrameOptions($value); $this->assertSame($value, $this->model->getHeader(Http::HEADER_X_FRAME_OPT)->getFieldValue()); } diff --git a/setup/src/Magento/Setup/Model/ConfigGenerator.php b/setup/src/Magento/Setup/Model/ConfigGenerator.php index 42701b7da25..fba3107325e 100644 --- a/setup/src/Magento/Setup/Model/ConfigGenerator.php +++ b/setup/src/Magento/Setup/Model/ConfigGenerator.php @@ -220,7 +220,7 @@ class ConfigGenerator { $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, 'DENY'); + $configData->set(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT, 'SAMEORIGIN'); } return $configData; } diff --git a/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php b/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php index 00a02f83b5f..12ce5af79e7 100644 --- a/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php +++ b/setup/src/Magento/Setup/Test/Unit/Model/ConfigGeneratorTest.php @@ -36,6 +36,6 @@ class ConfigGeneratorTest extends \PHPUnit_Framework_TestCase ->with(ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT) ->willReturn(null); $configData = $this->model->createXFrameConfig(); - $this->assertSame('DENY', $configData->getData()[ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT]); + $this->assertSame('SAMEORIGIN', $configData->getData()[ConfigOptionsListConstants::CONFIG_PATH_X_FRAME_OPT]); } } -- GitLab From d9c224ba3100d0ca5ce11d29902fe4cf5aa6f957 Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Sun, 21 Jun 2015 16:25:35 +0300 Subject: [PATCH 347/396] MTA-2350: Add wait to form element before filling a value --- .../Backend/Test/Block/Widget/FormTabs.php | 2 +- .../Test/Handler/Curl/CreateCustomer.php | 42 ----- .../Handler/Curl/CreateCustomerBackend.php | 75 --------- .../Handler/Curl/SaveCustomerWithAddress.php | 147 ------------------ .../Test/Handler/Ui/CreateAddress.php | 38 ----- .../Test/Handler/Webapi/CreateCustomer.php | 32 ---- .../Test/TestCase/CreateCurrencyRateTest.php | 2 +- .../Adminhtml/Catalog/Edit/UrlRewriteForm.php | 12 +- 8 files changed, 8 insertions(+), 342 deletions(-) delete mode 100644 dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomer.php delete mode 100644 dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomerBackend.php delete mode 100644 dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/SaveCustomerWithAddress.php delete mode 100644 dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Ui/CreateAddress.php delete mode 100644 dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Webapi/CreateCustomer.php diff --git a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php index 48899443bbd..b104c323051 100755 --- a/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php +++ b/dev/tests/functional/tests/app/Magento/Backend/Test/Block/Widget/FormTabs.php @@ -88,7 +88,7 @@ class FormTabs extends Form foreach ($tabs as $tabName => $tabFields) { $tab = $this->getTab($tabName); $this->openTab($tabName); - $tab->fillFormTab(array_merge($tabFields, $this->unassignedFields), $context); + $tab->fillFormTab($tabFields, $context); } if (!empty($this->unassignedFields)) { $this->fillMissedFields($tabs); diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomer.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomer.php deleted file mode 100644 index 744387049f2..00000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomer.php +++ /dev/null @@ -1,42 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Curl; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Curl; -use Magento\Mtf\Util\Protocol\CurlInterface; -use Magento\Mtf\Util\Protocol\CurlTransport; - -/** - * Class CreateCustomer. - * Curl handler for creating customer through registration page. - * - */ -class CreateCustomer extends Curl -{ - /** - * Post request for creating customer - * - * @param FixtureInterface $fixture [optional] - * @return mixed|string - */ - public function persist(FixtureInterface $fixture = null) - { - $data = $fixture->getData('fields'); - $fields = []; - foreach ($data as $key => $field) { - $fields[$key] = $field['value']; - } - $url = $_ENV['app_frontend_url'] . 'customer/account/createpost/?nocookie=true'; - $curl = new CurlTransport(); - $curl->write(CurlInterface::POST, $url, '1.0', [], $fields); - $response = $curl->read(); - $curl->close(); - - return $response; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomerBackend.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomerBackend.php deleted file mode 100644 index cad3c992efa..00000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/CreateCustomerBackend.php +++ /dev/null @@ -1,75 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Curl; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Curl; -use Magento\Mtf\Util\Protocol\CurlInterface; -use Magento\Mtf\Util\Protocol\CurlTransport; -use Magento\Mtf\Util\Protocol\CurlTransport\BackendDecorator; - -/** - * Curl handler for creating customer in admin - * - */ -class CreateCustomerBackend extends Curl -{ - /** - * Prepare POST data for creating customer request - * - * @param FixtureInterface $fixture - * @return array - */ - protected function _prepareData(FixtureInterface $fixture) - { - $data = $fixture->getData('fields'); - foreach ($data as $key => $values) { - $value = $this->_getValue($values); - if (null === $value) { - continue; - } - $data[$key] = $value; - } - - $curlData['account'] = $data; - return $curlData; - } - - /** - * Retrieve field value or return null if value does not exist - * - * @param array $values - * @return null|mixed - */ - protected function _getValue($values) - { - if (!isset($values['value'])) { - return null; - } - return isset($values['input_value']) ? $values['input_value'] : $values['value']; - } - - /** - * Post request for creating customer in backend - * - * @param FixtureInterface $fixture [optional] - * @return mixed|string - */ - public function persist(FixtureInterface $fixture = null) - { - $params = $this->_prepareData($fixture); - - $url = $_ENV['app_backend_url'] . 'customer/index/save/active_tab/account'; - $curl = new BackendDecorator(new CurlTransport(), $this->_configuration); - $curl->addOption(CURLOPT_HEADER, 1); - $curl->write(CurlInterface::POST, $url, '1.0', [], $params); - $response = $curl->read(); - $curl->close(); - - return $response; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/SaveCustomerWithAddress.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/SaveCustomerWithAddress.php deleted file mode 100644 index 43456cb34ee..00000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Curl/SaveCustomerWithAddress.php +++ /dev/null @@ -1,147 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Curl; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Curl; -use Magento\Mtf\Util\Protocol\CurlInterface; -use Magento\Mtf\Util\Protocol\CurlTransport; - -/** - * Curl handler for saving customer address in admin - * - */ -class SaveCustomerWithAddress extends Curl -{ - /** - * Url for saving data - * - * @var string - */ - protected $saveUrl = '/customer/address/formPost/?nocookie=true'; - - /** - * Url for saving customer - * - * @var string - */ - protected $saveCustomer = 'customer/account/createpost/?nocookie=true'; - - /** - * Url of new address form - * - * @var string - */ - protected $addressNew = '/customer/address/new/?nocookie=true'; - - /** - * Form key - * - * @var string - */ - protected $formKey; - - /** - * Prepare POST data for creating customer request - * - * @param array $data - * @return array - */ - protected function prepareData($data) - { - $curlData = []; - foreach ($data as $key => $values) { - $value = $this->getValue($values); - if (null === $value) { - continue; - } - $curlData[$key] = $value; - } - $curlData['success_url'] = ''; - $curlData['error_url'] = ''; - $curlData['default_billing'] = 1; - $curlData['default_shipping'] = 1; - - return $curlData; - } - - /** - * Retrieve field value or return null if value does not exist - * - * @param array $values - * @return null|mixed - */ - protected function getValue($values) - { - if (!isset($values['value'])) { - return null; - } - return isset($values['input_value']) ? $values['input_value'] : $values['value']; - } - - /** - * Execute handler - * - * @param FixtureInterface $fixture - * @return mixed - */ - public function persist(FixtureInterface $fixture = null) - { - /** @var \Magento\Customer\Test\Fixture\Customer $fixture */ - $address = $fixture->getDefaultBilling(); - $fields = $this->prepareData($address->getData('fields')); - $url = $_ENV['app_frontend_url'] . $this->saveUrl; - $curl = $this->saveCustomer($fixture); - $fields['form_key'] = $this->formKey; - $curl->write(CurlInterface::POST, $url, '1.0', [], $fields); - $response = $curl->read(); - $curl->close(); - - return $response; - } - - /** - * Get from key from response - * - * @param string $response - * @return string - */ - protected function getFromKey($response) - { - preg_match('/input name="form_key" type="hidden" value="(\w+)"/', $response, $matches); - $formKey = ''; - if (!empty($matches[1])) { - $formKey = $matches[1]; - } - return $formKey; - } - - /** - * Save new customer and get form key - * - * @param \Magento\Customer\Test\Fixture\Customer $fixture - * @return CurlTransport - */ - protected function saveCustomer(\Magento\Customer\Test\Fixture\Customer $fixture) - { - $data = $fixture->getData('fields'); - $fields = []; - foreach ($data as $key => $field) { - $fields[$key] = $field['value']; - } - $url = $_ENV['app_frontend_url'] . $this->saveCustomer; - $curl = new CurlTransport(); - $curl->write(CurlInterface::POST, $url, '1.0', [], $fields); - $curl->read(); - $urlForm = $_ENV['app_frontend_url'] . $this->addressNew; - $curl->write(CurlInterface::GET, $urlForm, '1.0', []); - $response = $curl->read(); - $this->formKey = $this->getFromKey($response); - - return $curl; - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Ui/CreateAddress.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Ui/CreateAddress.php deleted file mode 100644 index b2e9bdd33d6..00000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Ui/CreateAddress.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Ui; - -use Magento\Mtf\Factory\Factory; -use Magento\Mtf\Fixture\FixtureInterface; - -/** - * UI handler for creating customer address. - */ -class CreateAddress extends \Magento\Mtf\Handler\Ui -{ - /** - * Execute handler - * - * @param FixtureInterface $fixture [optional] - * @return mixed - */ - public function persist(FixtureInterface $fixture = null) - { - /** @var \Magento\Customer\Test\Fixture\Address $fixture */ - // Pages - $loginPage = Factory::getPageFactory()->getCustomerAccountLogin(); - $addressPage = Factory::getPageFactory()->getCustomerAddressEdit(); - - $loginPage->open(); - if ($loginPage->getLoginBlock()->isVisible()) { - $loginPage->getLoginBlock()->login($fixture->getCustomer()); - } - - $addressPage->open(); - $addressPage->getEditForm()->editCustomerAddress($fixture); - } -} diff --git a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Webapi/CreateCustomer.php b/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Webapi/CreateCustomer.php deleted file mode 100644 index af06e68b03e..00000000000 --- a/dev/tests/functional/tests/app/Magento/Customer/Test/Handler/Webapi/CreateCustomer.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Customer\Test\Handler\Webapi; - -use Magento\Mtf\Fixture\FixtureInterface; -use Magento\Mtf\Handler\Webapi; -use Magento\Mtf\Util\Protocol\SoapTransport; - -/** - * Class CreateCustomer - * - */ -class CreateCustomer extends Webapi -{ - /** - * Create customer through request - * - * @param FixtureInterface $fixture [optional] - * @return mixed - */ - public function persist(FixtureInterface $fixture = null) - { - $configuration = $this->_configuration->get('handler/0/webapi/0/value'); - - $soap = new SoapTransport($configuration['soap']); - return $soap->call('customerCustomerList', $fixture->getData()); - } -} diff --git a/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php index 04aa6c4ca73..22b8d54518d 100644 --- a/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php +++ b/dev/tests/functional/tests/app/Magento/Directory/Test/TestCase/CreateCurrencyRateTest.php @@ -25,7 +25,7 @@ use Magento\CurrencySymbol\Test\Page\Adminhtml\SystemCurrencyIndex; * 5. Perform assertions. * * @group Localization_(PS) - * @ZephyrId MAGETWO-12427, MAGETWO-36824 + * @ZephyrId MAGETWO-36824 */ class CreateCurrencyRateTest extends Injectable { diff --git a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php index 25f535527bb..5fb3fc21d02 100644 --- a/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php +++ b/dev/tests/functional/tests/app/Magento/UrlRewrite/Test/Block/Adminhtml/Catalog/Edit/UrlRewriteForm.php @@ -17,20 +17,21 @@ use Magento\Mtf\Fixture\FixtureInterface; class UrlRewriteForm extends Form { /** - * Get target path value for url rewrite fixture. + * Prepare data for url rewrite fixture. * * @param FixtureInterface $fixture - * @return string|void + * @return array */ - protected function getTargetPath(FixtureInterface $fixture) + protected function prepareData(FixtureInterface $fixture) { $data = $fixture->getData(); if (empty($data['entity_type']) && empty($this->getData()['target_path']) && !isset($data['target_path'])) { $entity = $fixture->getDataFieldConfig('target_path')['source']->getEntity(); - return $entity->hasData('identifier') + $data['target_path'] = $entity->hasData('identifier') ? $entity->getIdentifier() : $entity->getUrlKey() . '.html'; } + return $data; } /** @@ -65,8 +66,7 @@ class UrlRewriteForm extends Form array $replace = [] ) { $context = ($element === null) ? $this->_rootElement : $element; - $data = $fixture->getData(); - $data['target_path'] = $this->getTargetPath($fixture); + $data = $this->prepareData($fixture); foreach ($replace as $key => $value) { if (isset($data[$key])) { -- GitLab From 3ed28e1931e89f786b31031efa402b0e36a1c3ed Mon Sep 17 00:00:00 2001 From: Dmytro Kvashnin <dkvashnin@ebay.com> Date: Mon, 22 Jun 2015 10:56:51 +0300 Subject: [PATCH 348/396] MAGETWO-32921: Adapt Payment\Gateway framework to client requirement - turned off libxml errors for html form converter --- app/code/Magento/Payment/Block/Transparent/Form.php | 7 ++++--- .../Payment/Gateway/Http/Converter/HtmlFormConverter.php | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/Payment/Block/Transparent/Form.php b/app/code/Magento/Payment/Block/Transparent/Form.php index 3232776c730..2ff21bae087 100644 --- a/app/code/Magento/Payment/Block/Transparent/Form.php +++ b/app/code/Magento/Payment/Block/Transparent/Form.php @@ -169,10 +169,11 @@ class Form extends \Magento\Payment\Block\Form\Cc */ public function getMethodConfigData($fieldName) { - if ($this->getMethod() instanceof TransparentInterface) { - return $this->getMethod()->getConfigInterface()->getValue($fieldName); + $method = $this->getMethod(); + if ($method instanceof TransparentInterface) { + return $method->getConfigInterface()->getValue($fieldName); } - return $this->getMethod()->getConfigData($fieldName); + return $method->getConfigData($fieldName); } /** diff --git a/app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php b/app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php index c345aeed1dd..588a476bff9 100644 --- a/app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php +++ b/app/code/Magento/Payment/Gateway/Http/Converter/HtmlFormConverter.php @@ -20,9 +20,13 @@ class HtmlFormConverter implements ConverterInterface public function convert($response) { $document = new \DOMDocument(); + + libxml_use_internal_errors(true); if (!$document->loadHTML($response)) { throw new ConverterException(__('Wrong gateway response format.')); } + libxml_use_internal_errors(false); + $document->getElementsByTagName('input'); $convertedResponse = []; -- GitLab From 806f85418414f9a235dbd063eff5797f5cf5a3d3 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Mon, 22 Jun 2015 12:02:57 +0300 Subject: [PATCH 349/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - fixes after CR --- .../testsuite/Magento/Framework/App/FrontControllerTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/tests/integration/testsuite/Magento/Framework/App/FrontControllerTest.php b/dev/tests/integration/testsuite/Magento/Framework/App/FrontControllerTest.php index 5b84fa1bc97..37158f3e478 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'); -- GitLab From c332434dfab1feaee744d5dc7141df4bac19b3dc Mon Sep 17 00:00:00 2001 From: Olga Matviienko <omatviienko@ebay.com> Date: Mon, 22 Jun 2015 12:31:02 +0300 Subject: [PATCH 350/396] MAGETWO-38667: [UI] Assistance with applying new style for Gift Options - part 2 --- .../GiftMessage/view/frontend/web/template/gift-message.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index d93af0766c3..dbe0ee8c877 100644 --- a/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html +++ b/app/code/Magento/GiftMessage/view/frontend/web/template/gift-message.html @@ -12,7 +12,7 @@ <div class="title" data-role="title" data-bind="click: $data.toggleFormBlockVisibility.bind($data)"> <span data-bind="text: $t('Gift options')"></span> </div> - <div data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> + <div class="content" data-role="content" data-bind="visible: formBlockVisibility() || resultBlockVisibility()"> <!-- ko ifnot: resultBlockVisibility() --> <div class="gift-options"> <!-- ko foreach: getRegion('additionalOptions') --> -- GitLab From 78d318f308c6b6d6891d53b53e709fdb611c30b9 Mon Sep 17 00:00:00 2001 From: Dmytro Aponasenko <daponasenko@ebay.com> Date: Mon, 22 Jun 2015 13:59:34 +0300 Subject: [PATCH 351/396] MTA-2350: Add wait to form element before filling a value - fixed install test --- .../Checkout/Test/Block/Cart/Shipping.php | 36 ++-- .../Install/Test/Block/CreateAdmin.xml | 2 +- .../Install/Test/Block/CustomizeStore.php | 18 +- .../Install/Test/Block/CustomizeStore.xml | 12 +- .../Magento/Install/Test/Block/Database.php | 24 +++ .../Install/Test/Block/WebConfiguration.php | 24 +++ .../Install/Test/Block/WebConfiguration.xml | 4 +- .../Test/Constraint/AssertSuccessInstall.php | 6 +- .../Magento/Install/Test/Fixture/Install.xml | 42 ++--- .../Install/Test/TestCase/InstallTest.php | 20 +-- .../Install/Test/TestCase/InstallTest.xml | 164 ++++++------------ 11 files changed, 181 insertions(+), 171 deletions(-) diff --git a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php index 5581bb47ea9..c52774c67d3 100644 --- a/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php +++ b/dev/tests/functional/tests/app/Magento/Checkout/Test/Block/Cart/Shipping.php @@ -11,55 +11,61 @@ use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; /** - * Class Shipping - * Cart shipping block + * Cart shipping block. */ class Shipping extends Form { /** - * Form wrapper selector + * Form wrapper selector. * * @var string */ protected $formWrapper = '.content'; /** - * Open shipping form selector + * Open shipping form selector. * * @var string */ protected $openForm = '.title'; /** - * Get quote selector + * Get quote selector. * * @var string */ protected $getQuote = '.action.quote'; /** - * Update total selector + * Update total selector. * * @var string */ protected $updateTotalSelector = '.action.update'; /** - * Selector to access the shipping carrier method + * Selector to access the shipping carrier method. * * @var string */ protected $shippingMethod = '//span[text()="%s"]/following::*//*[contains(text(), "%s")]'; /** - * From with shipping available shipping methods + * From with shipping available shipping methods. * * @var string */ protected $shippingMethodForm = '#co-shipping-method-form'; /** - * Open estimate shipping and tax form + * Fields that are used in estimation shipping form. + * + * @var array + */ + protected $estimationFields = ['country_id', 'region_id', 'region', 'postcode']; + + /** + * Open estimate shipping and tax form. * * @return void */ @@ -71,7 +77,7 @@ class Shipping extends Form } /** - * Click Get quote button + * Click Get quote button. * * @return void */ @@ -81,7 +87,7 @@ class Shipping extends Form } /** - * Select shipping method + * Select shipping method. * * @param array $shipping * @return void @@ -97,7 +103,7 @@ class Shipping extends Form } /** - * Fill shipping and tax form + * Fill shipping and tax form. * * @param Address $address * @return void @@ -105,12 +111,14 @@ class Shipping extends Form public function fillEstimateShippingAndTax(Address $address) { $this->openEstimateShippingAndTax(); - $this->fill($address); + $data = $address->getData(); + $mapping = $this->dataMapping(array_intersect_key($data, array_flip($this->estimationFields))); + $this->_fill($mapping, $this->_rootElement); $this->clickGetQuote(); } /** - * Determines if the specified shipping carrier/method is visible on the cart + * Determines if the specified shipping carrier/method is visible on the cart. * * @param $carrier * @param $method diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml index 3f1616de3db..b21f140454d 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CreateAdmin.xml @@ -5,7 +5,7 @@ * See COPYING.txt for license details. */ --> -<mapping strict="0"> +<mapping strict="1"> <fields> <username> <selector>[name='adminUsername']</selector> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php index e9e81483fa4..efe02fa2148 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.php @@ -24,11 +24,11 @@ class CustomizeStore extends Form protected $next = "[ng-click*='checkModuleConstraints']"; /** - * First field selector + * Module configuration section. * * @var string */ - protected $firstField = '[ng-model*="language"]'; + protected $moduleConfiguration = '.customize-your-store-advanced'; /** * Click on 'Next' button. @@ -49,7 +49,17 @@ class CustomizeStore extends Form */ public function fill(FixtureInterface $fixture, SimpleElement $element = null) { - $this->waitForElementVisible($this->firstField); - return parent::fill($fixture, $element); + $this->waitForElementVisible($this->moduleConfiguration); + $data = $fixture->getData(); + $storeData = []; + foreach ($data as $key => $value) { + if (strpos($key, 'store') === 0) { + $storeData[$key] = $value; + } + } + $mapping = $this->dataMapping($storeData); + $this->_fill($mapping, $element); + + return $this; } } diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml index 24eaf10fa6a..8c99894d4e7 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/CustomizeStore.xml @@ -7,13 +7,13 @@ --> <mapping strict="0"> <fields> - <currency> - <selector>[ng-model*='currency']</selector> + <storeCurrency> + <selector>#storeCurrency</selector> <input>select</input> - </currency> - <language> - <selector>[ng-model*='language']</selector> + </storeCurrency> + <storeLanguage> + <selector>#storeLanguage</selector> <input>select</input> - </language> + </storeLanguage> </fields> </mapping> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php b/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php index e1efe0955d5..b532f1d1070 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/Database.php @@ -8,6 +8,8 @@ namespace Magento\Install\Test\Block; use Magento\Mtf\Block\Form; use Magento\Mtf\Client\Locator; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** * Database form. @@ -28,6 +30,28 @@ class Database extends Form */ protected $next = "[ng-click*='testConnection']"; + /** + * Fill database form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + $dbData = []; + foreach ($data as $key => $value) { + if (strpos($key, 'db') === 0) { + $dbData[$key] = $value; + } + } + $mapping = $this->dataMapping($dbData); + $this->_fill($mapping, $element); + + return $this; + } + /** * Get 'Test connection successful.' message. * diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php index 654dd1ffc8f..64a90917c4c 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.php @@ -7,6 +7,8 @@ namespace Magento\Install\Test\Block; use Magento\Mtf\Block\Form; +use Magento\Mtf\Fixture\FixtureInterface; +use Magento\Mtf\Client\Element\SimpleElement; /** * Web configuration block. @@ -27,6 +29,28 @@ class WebConfiguration extends Form */ protected $advancedOptions = "[ng-click*='advanced']"; + /** + * Fill web configuration form. + * + * @param FixtureInterface $fixture + * @param SimpleElement|null $element + * @return $this + */ + public function fill(FixtureInterface $fixture, SimpleElement $element = null) + { + $data = $fixture->getData(); + $webConfiguration = []; + foreach ($data as $key => $value) { + if (strpos($key, 'db') !== 0 && strpos($key, 'store') !== 0) { + $webConfiguration[$key] = $value; + } + } + $mapping = $this->dataMapping($webConfiguration); + $this->_fill($mapping, $element); + + return $this; + } + /** * Click on 'Next' button. * diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml index f88d760c4c9..a4b04f205ee 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Block/WebConfiguration.xml @@ -7,7 +7,9 @@ --> <mapping strict="0"> <fields> - <web /> + <baseUrl> + <selector>[name="base_url"]</selector> + </baseUrl> <admin /> <keyOwn> <selector>[value="user"]</selector> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php b/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php index 07ce519b594..dec19f621ed 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Constraint/AssertSuccessInstall.php @@ -24,7 +24,7 @@ class AssertSuccessInstall extends AbstractConstraint protected $adminFieldsList = [ ['pageData' => 'username', 'fixture' => 'username'], ['pageData' => 'e-mail', 'fixture' => 'email'], - ['pageData' => 'your_store_address', 'fixture' => 'web'], + ['pageData' => 'your_store_address', 'fixture' => 'baseUrl'], ['pageData' => 'magento_admin_address', 'fixture' => 'admin'] ]; @@ -57,8 +57,8 @@ class AssertSuccessInstall extends AbstractConstraint $allData[$key] = isset($value['value']) ? $value['value'] : $value; } - $allData['web'] = (isset($allData['https']) ? $allData['https'] : $allData['web']); - $allData['admin'] = $allData['web'] . $allData['admin'] . '/'; + $allData['baseUrl'] = (isset($allData['https']) ? $allData['https'] : $allData['baseUrl']); + $allData['admin'] = $allData['baseUrl'] . $allData['admin'] . '/'; foreach ($this->adminFieldsList as $field) { \PHPUnit_Framework_Assert::assertEquals( diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml b/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml index d846de8f0bd..2d831534592 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/Fixture/Install.xml @@ -6,25 +6,25 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/fixture.xsd"> - <fixture name="install" module="Magento_Install" type="virtual" entity_type="install" repository_class="Magento\Install\Test\Repository\Install" handler_interface="Magento\Install\Test\Handler\Install\InstallInterface" class="Magento\Install\Test\Fixture\Install"> - <field name="dbHost"/> - <field name="dbUser"/> - <field name="dbPassword"/> - <field name="dbName"/> - <field name="web"/> - <field name="admin"/> - <field name="adminUsername"/> - <field name="adminEmail"/> - <field name="adminPassword"/> - <field name="adminConfirm"/> - <field name="apacheRewrites"/> - <field name="dbTablePrefix"/> - <field name="keyOwn"/> - <field name="httpsAdmin"/> - <field name="https"/> - <field name="httpsFront"/> - <field name="keyValue"/> - <field name="language"/> - <field name="currency"/> - </fixture> + <fixture name="install" module="Magento_Install" type="virtual" entity_type="install" repository_class="Magento\Install\Test\Repository\Install" handler_interface="Magento\Install\Test\Handler\Install\InstallInterface" class="Magento\Install\Test\Fixture\Install"> + <field name="dbHost" /> + <field name="dbUser" /> + <field name="dbPassword" /> + <field name="dbName" /> + <field name="dbTablePrefix" /> + <field name="baseUrl" /> + <field name="admin" /> + <field name="adminUsername" /> + <field name="adminEmail" /> + <field name="adminPassword" /> + <field name="adminConfirm" /> + <field name="apacheRewrites" /> + <field name="keyOwn" /> + <field name="httpsAdmin" /> + <field name="https" /> + <field name="httpsFront" /> + <field name="keyValue" /> + <field name="storeLanguage" /> + <field name="storeCurrency" /> + </fixture> </config> diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php index fbfb262f120..ccf21709a84 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php +++ b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.php @@ -12,17 +12,13 @@ use Magento\Install\Test\Fixture\Install as InstallConfig; use Magento\User\Test\Fixture\User; use Magento\Mtf\Fixture\FixtureFactory; use Magento\Mtf\TestCase\Injectable; -use Magento\Mtf\Config\DataInterface; use Magento\Install\Test\Constraint\AssertAgreementTextPresent; use Magento\Install\Test\Constraint\AssertSuccessfulReadinessCheck; -use Magento\Mtf\ObjectManagerFactory; /** * PLEASE ADD NECESSARY INFO BEFORE RUNNING TEST TO * ../dev/tests/functional/config/config.xml * - * Test Flow: - * * Preconditions: * 1. Uninstall Magento. * @@ -67,20 +63,20 @@ class InstallTest extends Injectable */ public function __prepare() { - $config = ObjectManagerFactory::getObjectManager()->get('Magento\Mtf\Config\DataInterface'); + $config = $this->objectManager->get('Magento\Mtf\Config\DataInterface'); // Prepare config data $configData['dbHost'] = $config->get('install/0/host/0'); $configData['dbUser'] = $config->get('install/0/user/0'); $configData['dbPassword'] = $config->get('install/0/password/0'); $configData['dbName'] = $config->get('install/0/dbName/0'); - $configData['web'] = $config->get('install/0/baseUrl/0'); + $configData['baseUrl'] = $config->get('install/0/baseUrl/0'); $configData['admin'] = $config->get('install/0/backendName/0'); return ['configData' => $configData]; } /** - * Injection data. + * Uninstall Magento. * * @param CmsIndex $homePage * @param Install $installPage @@ -99,24 +95,24 @@ class InstallTest extends Injectable * Install Magento via web interface. * * @param User $user - * @param array $install * @param array $configData * @param FixtureFactory $fixtureFactory * @param AssertAgreementTextPresent $assertLicense * @param AssertSuccessfulReadinessCheck $assertReadiness + * @param array $install [optional] * @return array */ public function test( User $user, - array $install, array $configData, FixtureFactory $fixtureFactory, AssertAgreementTextPresent $assertLicense, - AssertSuccessfulReadinessCheck $assertReadiness + AssertSuccessfulReadinessCheck $assertReadiness, + array $install = [] ) { $dataConfig = array_merge($install, $configData); - if ($dataConfig['httpsFront'] != "-") { - $dataConfig['https'] = str_replace('http', 'https', $dataConfig['web']); + if (isset($dataConfig['httpsFront'])) { + $dataConfig['https'] = str_replace('http', 'https', $dataConfig['baseUrl']); } /** @var InstallConfig $installConfig */ $installConfig = $fixtureFactory->create('Magento\Install\Test\Fixture\Install', ['data' => $dataConfig]); diff --git a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml index a527c8538f6..ff6ba2d1f1d 100644 --- a/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml +++ b/dev/tests/functional/tests/app/Magento/Install/Test/TestCase/InstallTest.xml @@ -6,113 +6,59 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> - <testCase name="Magento\Install\Test\TestCase\InstallTest"> - <variation name="InstallTestVariation1"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with default values</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - </variation> - <variation name="InstallTestVariation2"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">custom</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with custom admin path</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - </variation> - <variation name="InstallTestVariation3"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">Yes</data> - <data name="install/keyValue" xsi:type="string">123123qa</data> - <data name="install/language" xsi:type="string">German (Germany)</data> - <data name="install/currency" xsi:type="string">Euro (EUR)</data> - <data name="currencySymbol" xsi:type="string">€</data> - <data name="languageTemplate" xsi:type="string">Suchbegriffe</data> - <data name="description" xsi:type="string">install with custom encryption key and changed currency and locale</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\Install\Test\Constraint\AssertKeyCreated"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - <constraint name="Magento\Install\Test\Constraint\AssertCurrencySelected"/> - <constraint name="Magento\Install\Test\Constraint\AssertLanguageSelected"/> - </variation> - <variation name="InstallTestVariation4"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">prefix1_</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">Chinese (China)</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with table prefix</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - </variation> - <variation name="InstallTestVariation5"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">-</data> - <data name="install/httpsAdmin" xsi:type="string">-</data> - <data name="install/apacheRewrites" xsi:type="string">Yes</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with enabled url rewrites</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - <constraint name="Magento\Install\Test\Constraint\AssertRewritesEnabled"/> - </variation> - <variation name="InstallTestVariation6"> - <data name="user/dataSet" xsi:type="string">default</data> - <data name="install/dbTablePrefix" xsi:type="string">-</data> - <data name="install/admin" xsi:type="string">-</data> - <data name="install/httpsFront" xsi:type="string">Yes</data> - <data name="install/httpsAdmin" xsi:type="string">Yes</data> - <data name="install/apacheRewrites" xsi:type="string">-</data> - <data name="install/keyOwn" xsi:type="string">-</data> - <data name="install/keyValue" xsi:type="string">-</data> - <data name="install/language" xsi:type="string">-</data> - <data name="install/currency" xsi:type="string">-</data> - <data name="currencySymbol" xsi:type="string">-</data> - <data name="languageTemplate" xsi:type="string">-</data> - <data name="description" xsi:type="string">install with enabled secure urls</data> - <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall"/> - <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin"/> - <constraint name="Magento\Install\Test\Constraint\AssertSecureUrlEnabled"/> - </variation> - </testCase> + <testCase name="Magento\Install\Test\TestCase\InstallTest"> + <variation name="InstallTestVariation1"> + <data name="description" xsi:type="string">Install with default values.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + </variation> + <variation name="InstallTestVariation2"> + <data name="description" xsi:type="string">Install with custom admin path.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/admin" xsi:type="string">custom</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + </variation> + <variation name="InstallTestVariation3"> + <data name="description" xsi:type="string">Install with custom encryption key and changed currency and locale.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/keyOwn" xsi:type="string">Yes</data> + <data name="install/keyValue" xsi:type="string">123123qa</data> + <data name="install/storeLanguage" xsi:type="string">German (Germany)</data> + <data name="install/storeCurrency" xsi:type="string">Euro (EUR)</data> + <data name="currencySymbol" xsi:type="string">€</data> + <data name="languageTemplate" xsi:type="string">Suchbegriffe</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\Install\Test\Constraint\AssertKeyCreated" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + <constraint name="Magento\Install\Test\Constraint\AssertCurrencySelected" /> + <constraint name="Magento\Install\Test\Constraint\AssertLanguageSelected" /> + </variation> + <variation name="InstallTestVariation4"> + <data name="description" xsi:type="string">Install with table prefix.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/dbTablePrefix" xsi:type="string">prefix1_</data> + <data name="install/storeLanguage" xsi:type="string">Chinese (China)</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + </variation> + <variation name="InstallTestVariation5"> + <data name="description" xsi:type="string">Install with enabled url rewrites.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/apacheRewrites" xsi:type="string">Yes</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + <constraint name="Magento\Install\Test\Constraint\AssertRewritesEnabled" /> + </variation> + <variation name="InstallTestVariation6"> + <data name="description" xsi:type="string">Install with enabled secure urls.</data> + <data name="user/dataSet" xsi:type="string">default</data> + <data name="install/httpsFront" xsi:type="string">Yes</data> + <data name="install/httpsAdmin" xsi:type="string">Yes</data> + <constraint name="Magento\Install\Test\Constraint\AssertSuccessInstall" /> + <constraint name="Magento\User\Test\Constraint\AssertUserSuccessLogin" /> + <constraint name="Magento\Install\Test\Constraint\AssertSecureUrlEnabled" /> + </variation> + </testCase> </config> -- GitLab From 6f8cab2261dd865c6c2f91a1815d5dfe45d9fec6 Mon Sep 17 00:00:00 2001 From: Dmytro Kvashnin <dkvashnin@ebay.com> Date: Mon, 22 Jun 2015 14:20:12 +0300 Subject: [PATCH 352/396] MAGETWO-32921: Adapt Payment\Gateway framework to client requirement - Added API documentation for Order Address --- .../Sales/Api/Data/OrderAddressInterface.php | 16 ++++++++++++++-- app/code/Magento/Sales/Model/Order/Address.php | 8 ++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php b/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php index fee0c4c9047..3b319b82613 100644 --- a/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php +++ b/app/code/Magento/Sales/Api/Data/OrderAddressInterface.php @@ -35,6 +35,10 @@ interface OrderAddressInterface extends \Magento\Framework\Api\ExtensibleDataInt * Region ID. */ const REGION_ID = 'region_id'; + /** + * Region code. + */ + const KEY_REGION_CODE = 'region_code'; /* * Customer ID. */ @@ -248,9 +252,9 @@ interface OrderAddressInterface extends \Magento\Framework\Api\ExtensibleDataInt public function getRegion(); /** - * Return 2 letter state code if available, otherwise full region name + * Gets the region code for the order address * - * @return null|string + * @return string|null Region code. */ public function getRegionCode(); @@ -501,6 +505,14 @@ interface OrderAddressInterface extends \Magento\Framework\Api\ExtensibleDataInt */ public function setVatRequestId($id); + /** + * Set region code + * + * @param string $regionCode + * @return $this + */ + public function setRegionCode($regionCode); + /** * Sets the VAT request date for the order address. * diff --git a/app/code/Magento/Sales/Model/Order/Address.php b/app/code/Magento/Sales/Model/Order/Address.php index 9486d6e0fb3..2ffcb048799 100644 --- a/app/code/Magento/Sales/Model/Order/Address.php +++ b/app/code/Magento/Sales/Model/Order/Address.php @@ -702,6 +702,14 @@ class Address extends AbstractModel implements OrderAddressInterface, AddressMod return $this->setData(OrderAddressInterface::VAT_REQUEST_ID, $id); } + /** + * {@inheritdoc} + */ + public function setRegionCode($regionCode) + { + return $this->setData(OrderAddressInterface::KEY_REGION_CODE, $regionCode); + } + /** * {@inheritdoc} */ -- GitLab From 69366719e1bcd399597fdacac52cdf117f16cb8d Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Mon, 22 Jun 2015 15:01:32 +0300 Subject: [PATCH 353/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Resource/Report/Product/ViewedTest.php | 287 ++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php 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 00000000000..77708b2db7e --- /dev/null +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Product/ViewedTest.php @@ -0,0 +1,287 @@ +<?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; + +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; + + /** + * {@inheritDoc} + */ + 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([$this, 'tableName']) + ); + + $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() + ] + ]; + } + + /** + * @return string + */ + public function tableName() + { + $args = func_get_args(); + + return $args[0]; + } +} -- GitLab From bd1ffc448d6263603c3fcea9283e5caec5c299b2 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Mon, 22 Jun 2015 17:32:27 +0300 Subject: [PATCH 354/396] MAGETWO-38954: UnitTest Coverage Magento\Reports* --- .../Reports/Test/Unit/Model/Resource/Order/CollectionTest.php | 1 + 1 file changed, 1 insertion(+) 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 index 503b953068d..885839ed256 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php @@ -115,6 +115,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); $this->orderFactoryMock = $this->getMockBuilder('Magento\Sales\Model\Resource\Report\OrderFactory') + ->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->selectMock = $this->getMockBuilder('Zend_Db_Select') -- GitLab From c1d1f3b2dc31c0de93a11ece38efb259ad5a6119 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Mon, 22 Jun 2015 10:10:18 -0500 Subject: [PATCH 355/396] MAGETWO-38065: /magento_verion exposes too detailed version information - insert space character --- app/code/Magento/Version/Controller/Index/Index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Version/Controller/Index/Index.php b/app/code/Magento/Version/Controller/Index/Index.php index 62bb63b30ee..0fe6235bc6c 100644 --- a/app/code/Magento/Version/Controller/Index/Index.php +++ b/app/code/Magento/Version/Controller/Index/Index.php @@ -40,7 +40,7 @@ class Index extends Action public function execute() { $versionParts = explode('.', $this->productMetadata->getVersion()); - if(!isset($versionParts[0]) || !isset($versionParts[1])) { + if (!isset($versionParts[0]) || !isset($versionParts[1])) { return ; // Major and minor version are not set - return empty response } $majorMinorVersion = $versionParts[0] . '.' . $versionParts[1]; -- GitLab From cf143562160d67982500c021d9ffc06352f22745 Mon Sep 17 00:00:00 2001 From: Olga Kopylova <okopylova@ebay.com> Date: Thu, 18 Jun 2015 15:44:27 -0500 Subject: [PATCH 356/396] MAGETWO-37894: Images can't be loaded if using separate Media Storage and disabled Webserver rewrites - added displaying errors in developer mode for media resources - removed unused variable --- app/code/Magento/MediaStorage/App/Media.php | 6 +++- .../Storage/Database/AbstractDatabase.php | 7 ----- .../MediaStorage/Test/Unit/App/MediaTest.php | 31 +++++++++++++++++++ .../Legacy/_files/obsolete_properties.php | 1 + 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/MediaStorage/App/Media.php b/app/code/Magento/MediaStorage/App/Media.php index a3c9c3bd3b0..59754755a89 100644 --- a/app/code/Magento/MediaStorage/App/Media.php +++ b/app/code/Magento/MediaStorage/App/Media.php @@ -140,7 +140,11 @@ class Media implements AppInterface public function catchException(App\Bootstrap $bootstrap, \Exception $exception) { $this->response->setHttpResponseCode(404); - $this->response->sendHeaders(); + if ($bootstrap->isDeveloperMode()) { + $this->response->setHeader('Content-Type', 'text/plain'); + $this->response->setBody($exception->getMessage() . "\n" . $exception->getTraceAsString()); + } + $this->response->sendResponse(); return true; } } diff --git a/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php b/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php index f8d8adae2b4..ad57bd14add 100644 --- a/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php +++ b/app/code/Magento/MediaStorage/Model/File/Storage/Database/AbstractDatabase.php @@ -15,13 +15,6 @@ abstract class AbstractDatabase extends \Magento\Framework\Model\AbstractModel */ const CONNECTION_DEFAULT = 'default_setup'; - /** - * Store media base directory path - * - * @var string - */ - protected $_mediaBaseDirectory = null; - /** * Core file storage database * diff --git a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php index 0dd09b909a7..8e33723f8de 100644 --- a/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php +++ b/app/code/Magento/MediaStorage/Test/Unit/App/MediaTest.php @@ -205,4 +205,35 @@ class MediaTest extends \PHPUnit_Framework_TestCase $this->responseMock->expects($this->once())->method('setHttpResponseCode')->with(404); $this->assertSame($this->responseMock, $this->model->launch()); } + + /** + * @param bool $isDeveloper + * @param int $setBodyCalls + * + * @dataProvider catchExceptionDataProvider + */ + public function testCatchException($isDeveloper, $setBodyCalls) + { + $bootstrap = $this->getMock('Magento\Framework\App\Bootstrap', [], [], '', false); + $exception = $this->getMock('Exception', [], [], '', false); + $this->responseMock->expects($this->once()) + ->method('setHttpResponseCode') + ->with(404); + $bootstrap->expects($this->once()) + ->method('isDeveloperMode') + ->will($this->returnValue($isDeveloper)); + $this->responseMock->expects($this->exactly($setBodyCalls)) + ->method('setBody'); + $this->responseMock->expects($this->once()) + ->method('sendResponse'); + $this->model->catchException($bootstrap, $exception); + } + + public function catchExceptionDataProvider() + { + return [ + 'default mode' => [false, 0], + 'developer mode' => [true, 1], + ]; + } } diff --git a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php index cfb1078156b..10bc4fee0ab 100644 --- a/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php +++ b/dev/tests/static/testsuite/Magento/Test/Legacy/_files/obsolete_properties.php @@ -166,6 +166,7 @@ return [ ['_filesystem', 'Magento\Core\Model\Resource\Setup\Migration', '_directory'], ['_filesystem', 'Magento\Core\Model\Theme\Collection', '_directory'], ['_mediaBaseDirectory', 'Magento\MediaStorage\Model\Resource\File\Storage\File'], + ['_mediaBaseDirectory', 'Magento\MediaStorage\Model\File\Storage\Database\AbstractDatabase'], ['_dbHelper', 'Magento\MediaStorage\Model\Resource\File\Storage\File'], ['_filesystem', 'Magento\Core\Model\Theme\CopyService', '_directory'], ['_baseDir', 'Magento\Core\Model\Theme\Collection'], -- GitLab From b3825ca9331133a97db49785e3451f9cca2b27a5 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Mon, 22 Jun 2015 19:51:22 +0300 Subject: [PATCH 357/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index 704a3b93373..a5b7909b1cb 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -37,24 +37,25 @@ define([ * * @param {Object} mixinList - object contains mixins list. * @param {Object} itemContainer - object with component config and DOM element link. + * @return {Promise} */ function initMixins(mixinList, itemContainer){ - var configStack = {}, - element = itemContainer.el; + var configStack, + element = itemContainer.el, + result = $.Deferred(); _.each(mixinList, function (mixinArray, componentName) { configStack = itemContainer.data[componentName]; require(mixinArray, function(){ for (var i = 0, len = arguments.length; i < len; i++){ - configStack = arguments[i](configStack, element); + $.extend(true, configStack, arguments[i](configStack, element)); } + result.resolve(itemContainer); }); - itemContainer.data[componentName] = configStack; }); - delete itemContainer.data.mixins; - return itemContainer; + return result; } /** * Parses elements 'data-mage-init' attribute as a valid JSON data. @@ -90,9 +91,17 @@ define([ .concat(virtuals) .forEach(function (itemContainer) { var mixins = itemContainer.data.mixins; + delete itemContainer.data.mixins; if (mixins) { - $.when(itemContainer = initMixins(mixins, itemContainer)).then(_.each(itemContainer.data, init.bind(null, itemContainer.el))); + $.when( + initMixins(mixins, itemContainer) + ).then(function (mergedItemContainer) { + _.each( + mergedItemContainer.data, + init.bind(null, mergedItemContainer.el) + ) + }); } else { _.each(itemContainer.data, init.bind(null, itemContainer.el)); } -- GitLab From 9785f39a788214b678154d00127bc6c499cabc76 Mon Sep 17 00:00:00 2001 From: Ivan Gavryshko <igavryshko@ebay.com> Date: Mon, 22 Jun 2015 11:52:24 -0500 Subject: [PATCH 358/396] MAGETWO-38994: Eliminate code duplication Magento\Framework\Composer\ComposerInformation and Magento\Setup\Model\ComposerInformation - fixed --- .../Composer}/ComposerInformationTest.php | 15 +- .../_files/testFromClone/composer.json | 0 .../_files/testFromClone/composer.lock | 0 .../_files/testFromClone/vendor/README | 0 .../testFromCreateProject/composer.json | 0 .../testFromCreateProject/composer.lock | 0 .../testFromCreateProject/vendor/README | 0 .../_files/testSkeleton/composer.json | 0 .../_files/testSkeleton/composer.lock | 0 .../_files/testSkeleton/vendor/README | 0 .../Composer}/_files/vendor_path.php | 0 .../Composer/ComposerInformation.php | 75 +++++----- .../Magento/Setup/Controller/Environment.php | 2 +- .../Setup/Model/ComposerInformation.php | 133 ------------------ 14 files changed, 57 insertions(+), 168 deletions(-) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/ComposerInformationTest.php (86%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testFromClone/composer.json (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testFromClone/composer.lock (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testFromClone/vendor/README (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testFromCreateProject/composer.json (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testFromCreateProject/composer.lock (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testFromCreateProject/vendor/README (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testSkeleton/composer.json (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testSkeleton/composer.lock (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/testSkeleton/vendor/README (100%) rename dev/tests/integration/testsuite/Magento/{Setup/Model => Framework/Composer}/_files/vendor_path.php (100%) delete mode 100644 setup/src/Magento/Setup/Model/ComposerInformation.php diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php similarity index 86% rename from dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php rename to dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php index cdcf2ca0817..5189bd86bf5 100644 --- a/dev/tests/integration/testsuite/Magento/Setup/Model/ComposerInformationTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php @@ -4,10 +4,10 @@ * See COPYING.txt for license details. */ -namespace Magento\Setup\Model; +namespace Magento\Framework\Composer; /** - * Tests Magento\Setup\Model\ComposerInformation + * Tests Magento\Framework\ComposerInformation */ class ComposerInformationTest extends \PHPUnit_Framework_TestCase { @@ -84,6 +84,17 @@ class ComposerInformationTest extends \PHPUnit_Framework_TestCase } } + public function testGetRootRequiredPackagesAndTypes($composerDir) + { + $this->setupDirectoryMock($composerDir); + $composerInfo = new ComposerInformation($this->filesystemMock, $this->ioMock); + + $requiredPackagesAndTypes = $composerInfo->getRootRequiredPackagesAndTypes(); + + $this->assertArrayHasKey('composer/composer', $requiredPackagesAndTypes); + $this->assertEquals('library', $requiredPackagesAndTypes['composer/composer']); + } + /** * Data provider that returns directories containing different types of composer files. * diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.json rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.json diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.lock b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.lock similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/composer.lock rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/composer.lock diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/vendor/README b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/vendor/README similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromClone/vendor/README rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromClone/vendor/README diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.json rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.json diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.lock b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.lock similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/composer.lock rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/composer.lock diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/vendor/README b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/vendor/README similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testFromCreateProject/vendor/README rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testFromCreateProject/vendor/README diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.json b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.json similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.json rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.json diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.lock b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.lock similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/composer.lock rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/composer.lock diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/vendor/README b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/vendor/README similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/testSkeleton/vendor/README rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/testSkeleton/vendor/README diff --git a/dev/tests/integration/testsuite/Magento/Setup/Model/_files/vendor_path.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/_files/vendor_path.php similarity index 100% rename from dev/tests/integration/testsuite/Magento/Setup/Model/_files/vendor_path.php rename to dev/tests/integration/testsuite/Magento/Framework/Composer/_files/vendor_path.php diff --git a/lib/internal/Magento/Framework/Composer/ComposerInformation.php b/lib/internal/Magento/Framework/Composer/ComposerInformation.php index 5ba195f386d..ef18e721e22 100644 --- a/lib/internal/Magento/Framework/Composer/ComposerInformation.php +++ b/lib/internal/Magento/Framework/Composer/ComposerInformation.php @@ -7,6 +7,8 @@ namespace Magento\Framework\Composer; use Composer\Factory as ComposerFactory; +use Composer\IO\BufferIO; +use Composer\Package\Link; use Composer\Package\PackageInterface; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; @@ -30,15 +32,28 @@ class ComposerInformation * Constructor * * @param Filesystem $filesystem + * @param BufferIO $io + * @throws \Exception */ public function __construct( - Filesystem $filesystem + Filesystem $filesystem, + BufferIO $io ) { - $vendor = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); - $vendorPath = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() . include $vendor; + // composer.json is in same directory as vendor + $vendorPath = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); + $vendorDir = require "{$vendorPath}"; + $composerJson = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() + . "/{$vendorDir}/../composer.json"; + + $composerJsonRealPath = realpath($composerJson); + if ($composerJsonRealPath === false) { + throw new \Exception('Composer file not found: ' . $composerJson); + } + + putenv('COMPOSER_HOME=' . $filesystem->getDirectoryRead(DirectoryList::COMPOSER_HOME)->getAbsolutePath()); + // Create Composer - $io = new \Composer\IO\BufferIO(); - $this->composer = ComposerFactory::create($io, $vendorPath . '/../composer.json'); + $this->composer = ComposerFactory::create($io, $composerJson); $this->locker = $this->composer->getLocker(); } @@ -55,12 +70,16 @@ class ComposerInformation $requiredPhpVersion = $allPlatformReqs['php']->getPrettyConstraint(); } else { $packages = $this->locker->getLockedRepository()->getPackages(); + /** @var PackageInterface $package */ foreach ($packages as $package) { - /** @var \Composer\Package\CompletePackage $package */ - $packageName = $package->getPrettyName(); - if ($packageName === 'magento/product-community-edition') { - $phpRequirementLink = $package->getRequires()['php']; - $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); + if ($package instanceof PackageInterface) { + $packageName = $package->getPrettyName(); + if ($packageName === 'magento/product-community-edition') { + $phpRequirementLink = $package->getRequires()['php']; + if ($phpRequirementLink instanceof Link) { + $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); + } + } } } } @@ -81,32 +100,23 @@ class ComposerInformation */ public function getRequiredExtensions() { - if ($this->isMagentoRoot()) { - $allPlatformReqs = $this->locker->getPlatformRequirements(true); - foreach ($allPlatformReqs as $reqIndex => $constraint) { - if (substr($reqIndex, 0, 4) === 'ext-') { - $requiredExtensions[] = substr($reqIndex, 4); - } - } - } else { - $requiredExtensions = []; + $requiredExtensions = []; + $allPlatformReqs = array_keys($this->locker->getPlatformRequirements(true)); + if (!$this->isMagentoRoot()) { /** @var \Composer\Package\CompletePackage $package */ foreach ($this->locker->getLockedRepository()->getPackages() as $package) { - $requires = $package->getRequires(); - $requires = array_merge($requires, $package->getDevRequires()); - foreach ($requires as $reqIndex => $constraint) { - if (substr($reqIndex, 0, 4) === 'ext-') { - $requiredExtensions[] = substr($reqIndex, 4); - } - } + $requires = array_keys($package->getRequires()); + $requires = array_merge($requires, array_keys($package->getDevRequires())); + $allPlatformReqs = array_merge($allPlatformReqs, $requires); } } - - if (!isset($requiredExtensions)) { - throw new \Exception('Cannot find extensions in \'composer.lock\' file'); + foreach ($allPlatformReqs as $reqIndex) { + if (substr($reqIndex, 0, 4) === 'ext-') { + $requiredExtensions[] = substr($reqIndex, 4); + } } - return $requiredExtensions; + return array_unique($requiredExtensions); } /** @@ -147,6 +157,7 @@ class ComposerInformation private function isMagentoRoot() { $rootPackage = $this->composer->getPackage(); - return ('magento/magento2ce' == $rootPackage->getName()); + + return preg_match('/magento\/magento2.e/', $rootPackage->getName()); } -} +} \ No newline at end of file diff --git a/setup/src/Magento/Setup/Controller/Environment.php b/setup/src/Magento/Setup/Controller/Environment.php index e88ed5e5960..1be03984799 100644 --- a/setup/src/Magento/Setup/Controller/Environment.php +++ b/setup/src/Magento/Setup/Controller/Environment.php @@ -8,7 +8,7 @@ namespace Magento\Setup\Controller; use Composer\Package\Version\VersionParser; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\JsonModel; -use Magento\Setup\Model\ComposerInformation; +use Magento\Framework\Composer\ComposerInformation; use Magento\Setup\Model\PhpInformation; use Magento\Setup\Model\FilePermissions; diff --git a/setup/src/Magento/Setup/Model/ComposerInformation.php b/setup/src/Magento/Setup/Model/ComposerInformation.php deleted file mode 100644 index 431f4c8243f..00000000000 --- a/setup/src/Magento/Setup/Model/ComposerInformation.php +++ /dev/null @@ -1,133 +0,0 @@ -<?php -/** - * Copyright © 2015 Magento. All rights reserved. - * See COPYING.txt for license details. - */ - -namespace Magento\Setup\Model; - -use Composer\Factory as ComposerFactory; -use Composer\IO\BufferIO; -use Composer\Package\Link; -use Composer\Package\PackageInterface; -use Magento\Framework\App\Filesystem\DirectoryList; -use Magento\Framework\Filesystem; - -/** - * Class ComposerInformation uses Composer to determine dependency information. - */ -class ComposerInformation -{ - /** - * @var \Composer\Composer - */ - private $composer; - - /** - * @var \Composer\Package\Locker - */ - private $locker; - - /** - * Constructor - * - * @param Filesystem $filesystem - * @param BufferIO $io - * @throws \Exception - */ - public function __construct( - Filesystem $filesystem, - BufferIO $io - ) { - // composer.json is in same directory as vendor - $vendorPath = $filesystem->getDirectoryRead(DirectoryList::CONFIG)->getAbsolutePath('vendor_path.php'); - $vendorDir = require "{$vendorPath}"; - $composerJson = $filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath() - . "/{$vendorDir}/../composer.json"; - - $composerJsonRealPath = realpath($composerJson); - if ($composerJsonRealPath === false) { - throw new \Exception('Composer file not found: ' . $composerJson); - } - - putenv('COMPOSER_HOME=' . $filesystem->getDirectoryRead(DirectoryList::COMPOSER_HOME)->getAbsolutePath()); - - // Create Composer - $this->composer = ComposerFactory::create($io, $composerJson); - $this->locker = $this->composer->getLocker(); - } - - /** - * Retrieves required php version - * - * @return string - * @throws \Exception If attributes are missing in composer.lock file. - */ - public function getRequiredPhpVersion() - { - if ($this->isMagentoRoot()) { - $allPlatformReqs = $this->locker->getPlatformRequirements(true); - $requiredPhpVersion = $allPlatformReqs['php']->getPrettyConstraint(); - } else { - $packages = $this->locker->getLockedRepository()->getPackages(); - /** @var PackageInterface $package */ - foreach ($packages as $package) { - if ($package instanceof PackageInterface) { - $packageName = $package->getPrettyName(); - if ($packageName === 'magento/product-community-edition') { - $phpRequirementLink = $package->getRequires()['php']; - if ($phpRequirementLink instanceof Link) { - $requiredPhpVersion = $phpRequirementLink->getPrettyConstraint(); - } - } - } - } - } - - if (!isset($requiredPhpVersion)) { - throw new \Exception('Cannot find php version requirement in \'composer.lock\' file'); - } - return $requiredPhpVersion; - } - - /** - * Retrieve list of required extensions - * - * Collect required extensions from composer.lock file - * - * @return array - * @throws \Exception If attributes are missing in composer.lock file. - */ - public function getRequiredExtensions() - { - $requiredExtensions = []; - $allPlatformReqs = array_keys($this->locker->getPlatformRequirements(true)); - - if (!$this->isMagentoRoot()) { - /** @var \Composer\Package\CompletePackage $package */ - foreach ($this->locker->getLockedRepository()->getPackages() as $package) { - $requires = array_keys($package->getRequires()); - $requires = array_merge($requires, array_keys($package->getDevRequires())); - $allPlatformReqs = array_merge($allPlatformReqs, $requires); - } - } - foreach ($allPlatformReqs as $reqIndex) { - if (substr($reqIndex, 0, 4) === 'ext-') { - $requiredExtensions[] = substr($reqIndex, 4); - } - } - return array_unique($requiredExtensions); - } - - /** - * Determines if Magento is the root package or it is included as a requirement. - * - * @return bool - */ - private function isMagentoRoot() - { - $rootPackage = $this->composer->getPackage(); - - return preg_match('/magento\/magento2.e/', $rootPackage->getName()); - } -} -- GitLab From f5185605a823236ac1e3713277f030fd8bdf6c0d Mon Sep 17 00:00:00 2001 From: Ivan Gavryshko <igavryshko@ebay.com> Date: Mon, 22 Jun 2015 12:41:10 -0500 Subject: [PATCH 359/396] MAGETWO-38994: Eliminate code duplication Magento\Framework\Composer\ComposerInformation and Magento\Setup\Model\ComposerInformation - fixed static test --- lib/internal/Magento/Framework/Composer/ComposerInformation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/Composer/ComposerInformation.php b/lib/internal/Magento/Framework/Composer/ComposerInformation.php index ef18e721e22..3ce005da4a8 100644 --- a/lib/internal/Magento/Framework/Composer/ComposerInformation.php +++ b/lib/internal/Magento/Framework/Composer/ComposerInformation.php @@ -160,4 +160,4 @@ class ComposerInformation return preg_match('/magento\/magento2.e/', $rootPackage->getName()); } -} \ No newline at end of file +} -- GitLab From dd75373d23de3f479ee9a29363ec4768298adf4a Mon Sep 17 00:00:00 2001 From: Ivan Gavryshko <igavryshko@ebay.com> Date: Mon, 22 Jun 2015 12:45:50 -0500 Subject: [PATCH 360/396] MAGETWO-38994: Eliminate code duplication Magento\Framework\Composer\ComposerInformation and Magento\Setup\Model\ComposerInformation - fixed functional test --- .../Magento/Framework/Composer/ComposerInformationTest.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php index 5189bd86bf5..d5c0ed6c45d 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php @@ -84,6 +84,11 @@ class ComposerInformationTest extends \PHPUnit_Framework_TestCase } } + /** + * @param $composerDir string Directory under _files that contains composer files + * + * @dataProvider getRequiredPhpVersionDataProvider + */ public function testGetRootRequiredPackagesAndTypes($composerDir) { $this->setupDirectoryMock($composerDir); -- GitLab From 696418671d231191e5549554bd6e40ef2c028df6 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Mon, 22 Jun 2015 16:37:09 -0500 Subject: [PATCH 361/396] MAGETWO-16192: Security: Clickjacking solution - introduce X-Frame-Options - move DI config from global to store module --- app/code/Magento/Store/etc/di.xml | 8 ++++++++ app/etc/di.xml | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/Store/etc/di.xml b/app/code/Magento/Store/etc/di.xml index 320253c316b..c47f73ec901 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/etc/di.xml b/app/etc/di.xml index 0f1149cd7ac..87986caa2ba 100644 --- a/app/etc/di.xml +++ b/app/etc/di.xml @@ -136,14 +136,6 @@ <preference for="Magento\Framework\Api\ImageContentValidatorInterface" type="Magento\Framework\Api\ImageContentValidator" /> <preference for="Magento\Framework\Api\ImageProcessorInterface" type="Magento\Framework\Api\ImageProcessor" /> <preference for="Magento\Framework\Code\Reader\ClassReaderInterface" type="Magento\Framework\Code\Reader\ClassReader" /> - <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\Model\Resource\Db\TransactionManager" shared="false" /> <type name="Magento\Framework\Logger\Handler\Base"> <arguments> -- GitLab From 2334dde1cadfe237b6b87fcee5d80951c7ce365e Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Mon, 22 Jun 2015 17:08:53 -0500 Subject: [PATCH 362/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - use getConnection instead of getConnectionByName in Resource --- lib/internal/Magento/Framework/App/Resource.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/Magento/Framework/App/Resource.php b/lib/internal/Magento/Framework/App/Resource.php index 34da454e85a..faf59ba520b 100644 --- a/lib/internal/Magento/Framework/App/Resource.php +++ b/lib/internal/Magento/Framework/App/Resource.php @@ -164,7 +164,7 @@ class Resource */ public function getTriggerName($tableName, $time, $event) { - return $this->getConnectionByName(self::DEFAULT_READ_RESOURCE)->getTriggerName($tableName, $time, $event); + return $this->getConnection(self::DEFAULT_READ_RESOURCE)->getTriggerName($tableName, $time, $event); } /** -- GitLab From 88e222967667a0eb1f97f38a1a1a06e6e54d4872 Mon Sep 17 00:00:00 2001 From: Ivan Gavryshko <igavryshko@ebay.com> Date: Mon, 22 Jun 2015 17:55:07 -0500 Subject: [PATCH 363/396] MAGETWO-38994: Eliminate code duplication Magento\Framework\Composer\ComposerInformation and Magento\Setup\Model\ComposerInformation - fixed method name according to CR --- .../Console/Command/UninstallLanguageCommand.php | 2 +- .../Unit/Console/Command/UninstallLanguageCommandTest.php | 8 ++++---- .../Framework/Composer/ComposerInformationTest.php | 2 +- .../Magento/Framework/Composer/ComposerInformation.php | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php index b84237bb2cd..c2e24328397 100644 --- a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php +++ b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php @@ -151,7 +151,7 @@ class UninstallLanguageCommand extends Command */ private function validate($package) { - $installedPackages = $this->composerInfo->getRootRequiredPackagesAndTypes(); + $installedPackages = $this->composerInfo->getRootRequiredPackageTypeByName(); if (isset($installedPackages[$package]) && $installedPackages[$package] === 'magento2-language') { return true; diff --git a/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php index 2f0cd02c6c9..4cbf8fa3dc5 100644 --- a/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php +++ b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php @@ -93,7 +93,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypeByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -123,7 +123,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypeByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -148,7 +148,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypeByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -178,7 +178,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackagesAndTypes') + ->method('getRootRequiredPackageTypeByName') ->willReturn( [ 'vendor/language-ua_ua' => 'library' diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php index d5c0ed6c45d..7a51753bbd1 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php @@ -94,7 +94,7 @@ class ComposerInformationTest extends \PHPUnit_Framework_TestCase $this->setupDirectoryMock($composerDir); $composerInfo = new ComposerInformation($this->filesystemMock, $this->ioMock); - $requiredPackagesAndTypes = $composerInfo->getRootRequiredPackagesAndTypes(); + $requiredPackagesAndTypes = $composerInfo->getRootRequiredPackageTypeByName(); $this->assertArrayHasKey('composer/composer', $requiredPackagesAndTypes); $this->assertEquals('library', $requiredPackagesAndTypes['composer/composer']); diff --git a/lib/internal/Magento/Framework/Composer/ComposerInformation.php b/lib/internal/Magento/Framework/Composer/ComposerInformation.php index 3ce005da4a8..d0185cce132 100644 --- a/lib/internal/Magento/Framework/Composer/ComposerInformation.php +++ b/lib/internal/Magento/Framework/Composer/ComposerInformation.php @@ -139,7 +139,7 @@ class ComposerInformation * * @return array */ - public function getRootRequiredPackagesAndTypes() + public function getRootRequiredPackageTypeByName() { $packages = []; /** @var PackageInterface $package */ -- GitLab From 80b94a07710c8353429fa76d70bb8b266c4b86eb Mon Sep 17 00:00:00 2001 From: Ivan Gavryshko <igavryshko@ebay.com> Date: Mon, 22 Jun 2015 18:11:21 -0500 Subject: [PATCH 364/396] MAGETWO-38994: Eliminate code duplication Magento\Framework\Composer\ComposerInformation and Magento\Setup\Model\ComposerInformation - fixed method name according to CR --- .../Console/Command/UninstallLanguageCommand.php | 2 +- .../Unit/Console/Command/UninstallLanguageCommandTest.php | 8 ++++---- .../Framework/Composer/ComposerInformationTest.php | 2 +- .../Magento/Framework/Composer/ComposerInformation.php | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php index c2e24328397..cd43fa1c36b 100644 --- a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php +++ b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php @@ -151,7 +151,7 @@ class UninstallLanguageCommand extends Command */ private function validate($package) { - $installedPackages = $this->composerInfo->getRootRequiredPackageTypeByName(); + $installedPackages = $this->composerInfo->getRootRequiredPackageTypesByName(); if (isset($installedPackages[$package]) && $installedPackages[$package] === 'magento2-language') { return true; diff --git a/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php index 4cbf8fa3dc5..9ccb47dd1e9 100644 --- a/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php +++ b/app/code/Magento/Translation/Test/Unit/Console/Command/UninstallLanguageCommandTest.php @@ -93,7 +93,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackageTypeByName') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -123,7 +123,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackageTypeByName') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -148,7 +148,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackageTypeByName') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'magento2-language' @@ -178,7 +178,7 @@ class UninstallLanguageCommandTest extends \PHPUnit_Framework_TestCase ->willReturn($dependencies); $this->composerInfo->expects($this->once()) - ->method('getRootRequiredPackageTypeByName') + ->method('getRootRequiredPackageTypesByName') ->willReturn( [ 'vendor/language-ua_ua' => 'library' diff --git a/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php index 7a51753bbd1..1fa911de8e9 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Composer/ComposerInformationTest.php @@ -94,7 +94,7 @@ class ComposerInformationTest extends \PHPUnit_Framework_TestCase $this->setupDirectoryMock($composerDir); $composerInfo = new ComposerInformation($this->filesystemMock, $this->ioMock); - $requiredPackagesAndTypes = $composerInfo->getRootRequiredPackageTypeByName(); + $requiredPackagesAndTypes = $composerInfo->getRootRequiredPackageTypesByName(); $this->assertArrayHasKey('composer/composer', $requiredPackagesAndTypes); $this->assertEquals('library', $requiredPackagesAndTypes['composer/composer']); diff --git a/lib/internal/Magento/Framework/Composer/ComposerInformation.php b/lib/internal/Magento/Framework/Composer/ComposerInformation.php index d0185cce132..852ef6aebef 100644 --- a/lib/internal/Magento/Framework/Composer/ComposerInformation.php +++ b/lib/internal/Magento/Framework/Composer/ComposerInformation.php @@ -139,7 +139,7 @@ class ComposerInformation * * @return array */ - public function getRootRequiredPackageTypeByName() + public function getRootRequiredPackageTypesByName() { $packages = []; /** @var PackageInterface $package */ -- GitLab From 61773e8d272dcb37191fcce89e78108ef657d552 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Tue, 23 Jun 2015 10:23:36 +0300 Subject: [PATCH 365/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/scripts.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/web/mage/apply/scripts.js b/lib/web/mage/apply/scripts.js index d9448fe1468..c7a9185054d 100644 --- a/lib/web/mage/apply/scripts.js +++ b/lib/web/mage/apply/scripts.js @@ -32,9 +32,25 @@ define([ * @param {HTMLElement} elem - Element whose data should be modified. */ function setData(components, elem) { - var data = elem.getAttribute(dataAttr); + var data = elem.getAttribute(dataAttr), + iterator; data = !!data ? JSON.parse(data) : {}; + + if(components.mixins) { + data.mixins = data.mixins || {}; + + for(iterator in components.mixins){ + if(!data.mixins[iterator]) { + data.mixins[iterator] = components.mixins[iterator].slice(); + }else { + data.mixins[iterator] = data.mixins[iterator].concat(components.mixins[iterator]); + } + } + + delete components.mixins; + } + data = $.extend(true, data, components); data = JSON.stringify(data); -- GitLab From 48552a5ca0177880703566a5111f0620c6a3c272 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Tue, 23 Jun 2015 11:46:21 +0300 Subject: [PATCH 366/396] MAGETWO-38155: Create block for order level --- .../Model/CustomerTokenServiceTest.php | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) 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 427cff705f1..993a369782e 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,19 +55,21 @@ 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'); } /** * @magentoApiDataFixture Magento/Customer/_files/customer.php - * @magentoAppIsolation enabled - * @magentoDbIsolation enabled */ public function testCreateCustomerAccessToken() { $customerUserName = 'customer@example.com'; $password = 'password'; + $isTokenCorrect = false; $serviceInfo = [ 'rest' => [ @@ -78,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); } /** -- GitLab From 202ea50472217e1ead80f8cedd194c141e5e885e Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 11:51:27 +0300 Subject: [PATCH 367/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Reports/Block/Adminhtml/Filter/Form.php | 2 +- app/code/Magento/Reports/Block/Adminhtml/Grid.php | 15 +++++++++++---- .../Reports/Block/Adminhtml/Grid/AbstractGrid.php | 6 +++++- .../Reports/Block/Adminhtml/Grid/Shopcart.php | 1 + .../Reports/Block/Product/AbstractProduct.php | 1 + app/code/Magento/Reports/Model/Flag.php | 1 + .../Magento/Reports/Model/Grouped/Collection.php | 2 ++ app/code/Magento/Reports/Model/Item.php | 4 ++++ .../Reports/Model/Resource/Product/Collection.php | 9 +++++++-- .../Index/Collection/AbstractCollection.php | 1 + .../Reports/Model/Resource/Report/Collection.php | 6 ++++++ .../Report/Collection/AbstractCollection.php | 5 +++++ .../Model/Resource/Wishlist/Collection.php | 2 ++ 13 files changed, 47 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php index 7c18123b5fa..fa27e2dd1c1 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php @@ -38,10 +38,10 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic /** * Set field visibility + * @codeCoverageIgnore * * @param string $fieldId * @param bool $visibility - * * @return void */ public function setFieldVisibility($fieldId, $visibility) diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid.php index 9fe1fa27a2c..3fd93b0d6b1 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid.php @@ -203,9 +203,9 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set visibility of store switcher + * @codeCoverageIgnore * * @param bool $visible - * * @return void */ public function setStoreSwitcherVisibility($visible = true) @@ -215,6 +215,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return visibility of store switcher + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -226,6 +227,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return store switcher html + * @codeCoverageIgnore * * @return string */ @@ -236,9 +238,9 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set visibility of date filter + * @codeCoverageIgnore * * @param bool $visible - * * @return void */ public function setDateFilterVisibility($visible = true) @@ -248,6 +250,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return visibility of date filter + * @codeCoverageIgnore * * @return bool * @SuppressWarnings(PHPMD.BooleanGetMethodName) @@ -259,6 +262,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return date filter html + * @codeCoverageIgnore * * @return string */ @@ -289,6 +293,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return refresh button html + * @codeCoverageIgnore * * @return string */ @@ -299,10 +304,10 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set filter + * @codeCoverageIgnore * * @param string $name * @param string $value - * * @return void */ public function setFilter($name, $value) @@ -329,9 +334,9 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set sub-report rows count + * @codeCoverageIgnore * * @param int $size - * * @return void */ public function setSubReportSize($size) @@ -341,6 +346,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Return sub-report rows count + * @codeCoverageIgnore * * @return int */ @@ -351,6 +357,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Retrieve errors + * @codeCoverageIgnore * * @return array */ diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php index 68b0b78bbbd..0d457a21808 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php @@ -86,6 +86,8 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** + * @codeCoverageIgnore + * * @return string */ public function getResourceCollectionName() @@ -339,8 +341,10 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** - * @param array $storeIds + * StoreIds setter + * @codeCoverageIgnore * + * @param array $storeIds * @return $this */ public function setStoreIds($storeIds) diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/Shopcart.php index 023f4f4bac7..0c635887cf0 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/Product/AbstractProduct.php b/app/code/Magento/Reports/Block/Product/AbstractProduct.php index dfe51eea66f..9bd4bd41be3 100644 --- a/app/code/Magento/Reports/Block/Product/AbstractProduct.php +++ b/app/code/Magento/Reports/Block/Product/AbstractProduct.php @@ -98,6 +98,7 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr /** * Public method for retrieve Product Index model + * @codeCoverageIgnore * * @return \Magento\Reports\Model\Product\Index\AbstractIndex */ diff --git a/app/code/Magento/Reports/Model/Flag.php b/app/code/Magento/Reports/Model/Flag.php index d289a0ce354..3782a655f24 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 6f8e9d561da..3f00e36c1a7 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 ecc9c805e91..01a60c397c5 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/Product/Collection.php b/app/code/Magento/Reports/Model/Resource/Product/Collection.php index 3eb9ac629a2..7df4b5dc4d9 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/Collection/AbstractCollection.php b/app/code/Magento/Reports/Model/Resource/Product/Index/Collection/AbstractCollection.php index b172b4e053c..77ea700b2cc 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/Report/Collection.php b/app/code/Magento/Reports/Model/Resource/Report/Collection.php index 2de5f389f25..abc6db15ad0 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 234d520b32b..4575ec6394c 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/Wishlist/Collection.php b/app/code/Magento/Reports/Model/Resource/Wishlist/Collection.php index 797b20da855..ab98d411ca0 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 */ -- GitLab From 6d5ab62fa6c73aa9fd82c153d315546d67f4400c Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 13:07:02 +0300 Subject: [PATCH 368/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- app/code/Magento/Reports/Helper/Data.php | 2 +- .../Reports/Test/Unit/Helper/DataTest.php | 147 ++++++++++++++++++ 2 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 app/code/Magento/Reports/Test/Unit/Helper/DataTest.php diff --git a/app/code/Magento/Reports/Helper/Data.php b/app/code/Magento/Reports/Helper/Data.php index 50856d3b37c..b81544d5e7a 100644 --- a/app/code/Magento/Reports/Helper/Data.php +++ b/app/code/Magento/Reports/Helper/Data.php @@ -55,7 +55,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/Test/Unit/Helper/DataTest.php b/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php new file mode 100644 index 00000000000..55ecb057947 --- /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' => [] + ] + ]; + } +} -- GitLab From 1a8cb3896c87f85e96ae1f6873148e59562c69d0 Mon Sep 17 00:00:00 2001 From: Dmytro Kvashnin <dkvashnin@ebay.com> Date: Tue, 23 Jun 2015 13:37:17 +0300 Subject: [PATCH 369/396] MAGETWO-32921: Adapt Payment\Gateway framework to client requirement - removed adminhtml-specific code from iframe template --- .../view/frontend/templates/transparent/iframe.phtml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml b/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml index c3c4a3ca098..93ac9970e14 100644 --- a/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml +++ b/app/code/Magento/Payment/view/frontend/templates/transparent/iframe.phtml @@ -20,7 +20,6 @@ $params = $block->getParams(); window.top.alert(<?php echo $this->helper('Magento\Framework\Json\Helper\Data')->jsonEncode($params['error_msg']) ?>); var require = window.top.require; require(['jquery'], function($) { - $('#edit_form').trigger('processStop'); $('#opc-review').trigger('hideAjaxLoader'); }); <?php elseif (isset($params['order_success'])): ?> @@ -28,16 +27,6 @@ $params = $block->getParams(); <?php else: ?> var require = window.top.require; require(['jquery'], function($) { - $('#edit_form').trigger('processStop'); - - $("input[name='payment[cc_number]']").prop('disabled', true); - $("select[name='payment[cc_type]']").prop('disabled', true); - $("select[name='payment[cc_exp_month]']").prop('disabled', true); - $("select[name='payment[cc_exp_year]']").prop('disabled', true); - $("input[name='payment[cc_cid]']").prop('disabled', true); - - $('#edit_form').trigger('realOrder'); - $('#originalPlaceOrder').click(); }); <?php endif; ?> -- GitLab From 034a475c68b864a24a75c5918c8798a29762be9d Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 23 Jun 2015 13:41:41 +0300 Subject: [PATCH 370/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - fixes after CR --- app/code/Magento/Backend/etc/adminhtml/system.xml | 10 +++++----- app/code/Magento/Captcha/etc/adminhtml/system.xml | 2 +- app/code/Magento/Catalog/etc/adminhtml/system.xml | 2 +- .../Magento/CatalogInventory/etc/adminhtml/system.xml | 2 +- app/code/Magento/Cms/Setup/InstallData.php | 4 ++-- .../Magento/Customer/Controller/Account/CreatePost.php | 2 +- app/code/Magento/Customer/etc/adminhtml/system.xml | 4 ++-- .../view/frontend/templates/form/register.phtml | 2 +- app/code/Magento/GoogleOptimizer/Helper/Form.php | 2 +- .../GoogleOptimizer/Test/Unit/Helper/FormTest.php | 2 +- app/code/Magento/Msrp/etc/adminhtml/system.xml | 2 +- app/code/Magento/Persistent/etc/adminhtml/system.xml | 2 +- app/code/Magento/Review/Setup/InstallSchema.php | 4 ++-- .../Sales/view/frontend/templates/guest/form.phtml | 2 +- .../view/frontend/templates/widget/guest/form.phtml | 2 +- .../Translation/Model/Js/Config/Source/Strategy.php | 4 ++-- .../Test/Unit/Model/Js/Config/Source/StrategyTest.php | 4 ++-- .../Sales/Test/TestCase/CancelCreatedOrderTest.xml | 2 +- .../Sales/Test/TestCase/HoldCreatedOrderTest.xml | 2 +- 19 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/code/Magento/Backend/etc/adminhtml/system.xml b/app/code/Magento/Backend/etc/adminhtml/system.xml index 7cb4eadb7db..5dbc4c0c399 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"> @@ -509,10 +509,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 +552,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/Captcha/etc/adminhtml/system.xml b/app/code/Magento/Captcha/etc/adminhtml/system.xml index 08d4a06aa6b..d1777164dc9 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/Catalog/etc/adminhtml/system.xml b/app/code/Magento/Catalog/etc/adminhtml/system.xml index fc2a339f404..3b914826a2a 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/CatalogInventory/etc/adminhtml/system.xml b/app/code/Magento/CatalogInventory/etc/adminhtml/system.xml index 3244113f95c..4155c546202 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> diff --git a/app/code/Magento/Cms/Setup/InstallData.php b/app/code/Magento/Cms/Setup/InstallData.php index 32f64b54b55..ea3b6ddaa3f 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>You session ID on the server.</td> </tr> <tr> <th>GUEST-VIEW</th> diff --git a/app/code/Magento/Customer/Controller/Account/CreatePost.php b/app/code/Magento/Customer/Controller/Account/CreatePost.php index c870a10b23b..bad09bdeff3 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 ) ); diff --git a/app/code/Magento/Customer/etc/adminhtml/system.xml b/app/code/Magento/Customer/etc/adminhtml/system.xml index f79f0e9db3f..8ccba94947f 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/frontend/templates/form/register.phtml b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml index 37d3d2291b2..e70d8a7fda7 100644 --- a/app/code/Magento/Customer/view/frontend/templates/form/register.phtml +++ b/app/code/Magento/Customer/view/frontend/templates/form/register.phtml @@ -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/GoogleOptimizer/Helper/Form.php b/app/code/Magento/GoogleOptimizer/Helper/Form.php index 0bd1972f87e..ba6780e4298 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 4c4d6be988c..5c020011f3d 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/Msrp/etc/adminhtml/system.xml b/app/code/Magento/Msrp/etc/adminhtml/system.xml index 9e9f459c569..bc779be0f26 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/Persistent/etc/adminhtml/system.xml b/app/code/Magento/Persistent/etc/adminhtml/system.xml index 777373b1422..6e04f0a0641 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/Review/Setup/InstallSchema.php b/app/code/Magento/Review/Setup/InstallSchema.php index 147688bdf15..a4cf7d27db3 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/Sales/view/frontend/templates/guest/form.phtml b/app/code/Magento/Sales/view/frontend/templates/guest/form.phtml index 89089385f0e..ca1ec172f8e 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 81f64f5f7cc..113b1ad7495 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/Translation/Model/Js/Config/Source/Strategy.php b/app/code/Magento/Translation/Model/Js/Config/Source/Strategy.php index 767e228a82b..fbeee6f52b5 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 8fdc964cc9a..2f41a8df240 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/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CancelCreatedOrderTest.xml b/dev/tests/functional/tests/app/Magento/Sales/Test/TestCase/CancelCreatedOrderTest.xml index b5c195908cc..043c556bc3f 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 962f0262f34..b860583704c 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> -- GitLab From 2bb9b3f066f46846fb676aa5ff6809e422595e10 Mon Sep 17 00:00:00 2001 From: Denys Rul <drul@ebay.com> Date: Tue, 23 Jun 2015 14:35:27 +0300 Subject: [PATCH 371/396] MAGETWO-38889: PR prep & processing - Change dependency order --- app/code/Magento/Ui/view/base/web/js/grid/massactions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js index d90de60c5a6..21e86a6d640 100644 --- a/app/code/Magento/Ui/view/base/web/js/grid/massactions.js +++ b/app/code/Magento/Ui/view/base/web/js/grid/massactions.js @@ -4,8 +4,8 @@ */ define([ 'underscore', - 'mageUtils', 'uiRegistry', + 'mageUtils', 'Magento_Ui/js/lib/collapsible', 'Magento_Ui/js/modal/confirm', 'Magento_Ui/js/modal/alert', -- GitLab From dd0b8dd54d2d0a4a648a97e7b41c867d93c98ef8 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 16:19:37 +0300 Subject: [PATCH 372/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Test/Unit/Model/Event/ObserverTest.php | 187 +++++++++++------- .../Test/Unit/Model/Plugin/LogTest.php | 78 ++++---- .../Unit/Model/Product/Index/ComparedTest.php | 149 ++++++++++++++ 3 files changed, 309 insertions(+), 105 deletions(-) create mode 100644 app/code/Magento/Reports/Test/Unit/Model/Product/Index/ComparedTest.php 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 ba4dc5396b3..7e53522ac66 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 a6585041528..f09954877cb 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php @@ -1,84 +1,86 @@ <?php /** - * Copyright © 2015 Magento. All rights reserved. + * 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 00000000000..7a2a7213a6b --- /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()); + } +} -- GitLab From 91061e6afef64bd57d145dedbdb85b92d16e42f8 Mon Sep 17 00:00:00 2001 From: Dmytro Vilchynskyi <dvilchynskyi@ebay.com> Date: Tue, 23 Jun 2015 17:57:11 +0300 Subject: [PATCH 373/396] MAGETWO-36131: Update Content in Magento 2 by Modules - part 3 - fixes after CR --- app/code/Magento/Cms/Setup/InstallData.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Cms/Setup/InstallData.php b/app/code/Magento/Cms/Setup/InstallData.php index ea3b6ddaa3f..726a8e45f01 100644 --- a/app/code/Magento/Cms/Setup/InstallData.php +++ b/app/code/Magento/Cms/Setup/InstallData.php @@ -258,7 +258,7 @@ class InstallData implements InstallDataInterface </tr> <tr> <th>FRONTEND</th> - <td>You session ID on the server.</td> + <td>Your session ID on the server.</td> </tr> <tr> <th>GUEST-VIEW</th> -- GitLab From be66752b68dece2d15599d6ea3cd8b6875f80195 Mon Sep 17 00:00:00 2001 From: Ivan Gavryshko <igavryshko@ebay.com> Date: Tue, 23 Jun 2015 10:01:09 -0500 Subject: [PATCH 374/396] MAGETWO-38994: Eliminate code duplication Magento\Framework\Composer\ComposerInformation and Magento\Setup\Model\ComposerInformation - suppressed phpmd warning --- .../Translation/Console/Command/UninstallLanguageCommand.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php index cd43fa1c36b..a8c360f6444 100644 --- a/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php +++ b/app/code/Magento/Translation/Console/Command/UninstallLanguageCommand.php @@ -19,6 +19,8 @@ use Magento\Framework\Setup\BackupRollbackFactory; /** * Command for uninstalling language and backup-code feature + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class UninstallLanguageCommand extends Command { -- GitLab From 60125db5d39ca7ad2809c82ea1b76828f8f2a144 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 18:08:04 +0300 Subject: [PATCH 375/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Model/Resource/Event/Collection.php | 1 + .../Model/Resource/Event/CollectionTest.php | 161 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php diff --git a/app/code/Magento/Reports/Model/Resource/Event/Collection.php b/app/code/Magento/Reports/Model/Resource/Event/Collection.php index 7a515823998..94124028fdb 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/Test/Unit/Model/Resource/Event/CollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Event/CollectionTest.php new file mode 100644 index 00000000000..2191830c60f --- /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(?)' + ] + ]; + } +} -- GitLab From 8265dbf6215ed9e96ac2513ebfd9897f5dde7c98 Mon Sep 17 00:00:00 2001 From: Leonid Poluyanov <lpoluyanov@ebay.com> Date: Tue, 23 Jun 2015 18:22:04 +0300 Subject: [PATCH 376/396] MAGETWO-38946: Create pull request for a sprint 22 results --- .../Magento/CatalogInventory/Model/Stock/ItemTest.php | 3 +++ 1 file changed, 3 insertions(+) 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 6f1de7273cd..ca4260d5c03 100644 --- a/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php +++ b/dev/tests/integration/testsuite/Magento/CatalogInventory/Model/Stock/ItemTest.php @@ -89,6 +89,9 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->assertEquals('invalid', $indexerProcessor->getIndexer()->getStatus()); + + $indexer->setScheduled(false); + $indexer->getState()->setStatus(State::STATUS_VALID)->save(); } /** -- GitLab From 785aca67bce345bd99e8407e3ec9bc2c307e3230 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Tue, 23 Jun 2015 11:23:06 -0500 Subject: [PATCH 377/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 - add unit test --- .../Magento/Framework/App/Resource.php | 1 - .../Framework/App/Test/Unit/ResourceTest.php | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/internal/Magento/Framework/App/Resource.php b/lib/internal/Magento/Framework/App/Resource.php index faf59ba520b..fae3cdb761c 100644 --- a/lib/internal/Magento/Framework/App/Resource.php +++ b/lib/internal/Magento/Framework/App/Resource.php @@ -160,7 +160,6 @@ class Resource * @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 getTriggerName($tableName, $time, $event) { diff --git a/lib/internal/Magento/Framework/App/Test/Unit/ResourceTest.php b/lib/internal/Magento/Framework/App/Test/Unit/ResourceTest.php index a92a9eb7343..86fc5bf7ac9 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)); + } } -- GitLab From ecab9965c6bca75797d05e41159a857cdfa1f5fa Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 19:25:40 +0300 Subject: [PATCH 378/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- app/code/Magento/Reports/Block/Product/AbstractProduct.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/Magento/Reports/Block/Product/AbstractProduct.php b/app/code/Magento/Reports/Block/Product/AbstractProduct.php index 9bd4bd41be3..dfe51eea66f 100644 --- a/app/code/Magento/Reports/Block/Product/AbstractProduct.php +++ b/app/code/Magento/Reports/Block/Product/AbstractProduct.php @@ -98,7 +98,6 @@ abstract class AbstractProduct extends \Magento\Catalog\Block\Product\AbstractPr /** * Public method for retrieve Product Index model - * @codeCoverageIgnore * * @return \Magento\Reports\Model\Product\Index\AbstractIndex */ -- GitLab From d41b2e0a3ca1929c5079b4b847e00c512b5f5405 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 19:28:47 +0300 Subject: [PATCH 379/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Reports/Block/Product/AbstractProduct.php | 20 +++++-------------- .../Test/Unit/Model/Plugin/LogTest.php | 2 +- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/app/code/Magento/Reports/Block/Product/AbstractProduct.php b/app/code/Magento/Reports/Block/Product/AbstractProduct.php index dfe51eea66f..cf420b4d3ce 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/Test/Unit/Model/Plugin/LogTest.php b/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php index f09954877cb..f9ee6d86285 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Plugin/LogTest.php @@ -1,6 +1,6 @@ <?php /** - * Copyright � 2015 Magento. All rights reserved. + * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -- GitLab From f9dd650d05d72f6930dc386902ffbb11067c9c90 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 19:33:24 +0300 Subject: [PATCH 380/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Model/Resource/Report/Product/ViewedTest.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) 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 index 77708b2db7e..6a4616a4c40 100644 --- 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 @@ -131,7 +131,11 @@ class ViewedTest extends \PHPUnit_Framework_TestCase ->getMock(); $this->resourceMock->expects($this->any())->method('getConnection')->willReturn($this->connectionMock); $this->resourceMock->expects($this->any())->method('getTableName')->will( - $this->returnCallback([$this, 'tableName']) + $this->returnCallback( + function ($arg) { + return $arg; + } + ) ); $this->contextMock = $this->getMockBuilder('Magento\Framework\Model\Resource\Db\Context') @@ -274,14 +278,4 @@ class ViewedTest extends \PHPUnit_Framework_TestCase ] ]; } - - /** - * @return string - */ - public function tableName() - { - $args = func_get_args(); - - return $args[0]; - } } -- GitLab From 20658cf045eaaddf40f11b424fc1819d74a37974 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 20:00:50 +0300 Subject: [PATCH 381/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Reports/Test/Unit/Helper/DataTest.php | 294 +++++++++--------- .../Test/Unit/Model/Resource/HelperTest.php | 244 +++++++-------- 2 files changed, 269 insertions(+), 269 deletions(-) diff --git a/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php b/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php index 55ecb057947..81eb87c4cac 100644 --- a/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php +++ b/app/code/Magento/Reports/Test/Unit/Helper/DataTest.php @@ -1,147 +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' => [] - ] - ]; - } -} +<?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/Resource/HelperTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php index fe0aef2871a..b000c4ad43a 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/HelperTest.php @@ -1,122 +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] - ]; - } -} +<?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] + ]; + } +} -- GitLab From 95c1e30eff6bd854b9715a3b83e34641481ac10b Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 20:11:48 +0300 Subject: [PATCH 382/396] MAGETWO-39089: UnitTest Coverage Magento\Reports* pt2 --- .../Test/Unit/Model/Resource/Report/Product/ViewedTest.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 index 6a4616a4c40..b22e4f2bf04 100644 --- 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 @@ -8,6 +8,10 @@ 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 { /** @@ -91,7 +95,8 @@ class ViewedTest extends \PHPUnit_Framework_TestCase protected $flagMock; /** - * {@inheritDoc} + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @return void */ protected function setUp() { -- GitLab From 27ee33963198b3e3fba30476dd3776c47ec02352 Mon Sep 17 00:00:00 2001 From: Stanislav Lopukhov <slopukhov@ebay.com> Date: Tue, 23 Jun 2015 20:14:29 +0300 Subject: [PATCH 383/396] MAGETWO-38954: UnitTest Coverage Magento\Reports* --- .../Reports/Test/Unit/Model/Resource/Order/CollectionTest.php | 3 +++ 1 file changed, 3 insertions(+) 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 index 885839ed256..22a6bb1be49 100644 --- a/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php +++ b/app/code/Magento/Reports/Test/Unit/Model/Resource/Order/CollectionTest.php @@ -8,6 +8,9 @@ namespace Magento\Reports\Test\Unit\Model\Resource\Order; use Magento\Reports\Model\Resource\Order\Collection; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class CollectionTest extends \PHPUnit_Framework_TestCase { /** -- GitLab From d9aca35beeac4452984eab85f6561febc405c2c1 Mon Sep 17 00:00:00 2001 From: Fred Sung <csung@ebay.com> Date: Tue, 23 Jun 2015 13:24:48 -0500 Subject: [PATCH 384/396] MAGETWO-38833: Fix error message format inconsistency in theme uninstall command - Rephrase error messages. --- .../Console/Command/ThemeUninstallCommand.php | 10 +++--- .../Command/ThemeUninstallCommandTest.php | 36 ++++++++++--------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php index 871c5d5650d..b2af6f7e45f 100644 --- a/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php +++ b/app/code/Magento/Theme/Console/Command/ThemeUninstallCommand.php @@ -209,7 +209,7 @@ class ThemeUninstallCommand extends Command ); if (!empty($messages)) { $output->writeln( - '<error>Unable to uninstall. Please fix the following issues:</error>' + '<error>Unable to uninstall. Please resolve the following issues:</error>' . PHP_EOL . implode(PHP_EOL, $messages) ); return; @@ -290,7 +290,7 @@ class ThemeUninstallCommand extends Command if (!empty($dependingPackages)) { $messages[] = '<error>' . $packageToPath[$package] . - " has the following package(s) depend on it:</error>" . + " has the following dependent package(s):</error>" . PHP_EOL . "\t<error>" . implode('</error>' . PHP_EOL . "\t<error>", $dependingPackages) . "</error>"; } @@ -321,11 +321,13 @@ class ThemeUninstallCommand extends Command } if (!empty($themeHasVirtualChildren)) { $text = count($themeHasVirtualChildren) > 1 ? ' are parents of' : ' is a parent of'; - $messages[] = '<error>' . implode(', ', $themeHasVirtualChildren) . $text . ' virtual theme</error>'; + $messages[] = '<error>' . implode(', ', $themeHasVirtualChildren) . $text . ' virtual theme.' + . ' Parent themes cannot be uninstalled.</error>'; } if (!empty($themeHasPhysicalChildren)) { $text = count($themeHasPhysicalChildren) > 1 ? ' are parents of' : ' is a parent of'; - $messages[] = '<error>' . implode(', ', $themeHasPhysicalChildren) . $text . ' physical theme</error>'; + $messages[] = '<error>' . implode(', ', $themeHasPhysicalChildren) . $text . ' physical theme.' + . ' Parent themes cannot be uninstalled.</error>'; } return $messages; } diff --git a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php index 87f93bb408e..c2a78ac5552 100644 --- a/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php +++ b/app/code/Magento/Theme/Test/Unit/Console/Command/ThemeUninstallCommandTest.php @@ -271,7 +271,7 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase ->willReturn(['frontend/Magento/a is in use in default config']); $this->tester->execute(['theme' => ['frontend/Magento/a']]); $this->assertEquals( - 'Unable to uninstall. Please fix the following issues:' . PHP_EOL + 'Unable to uninstall. Please resolve the following issues:' . PHP_EOL . 'frontend/Magento/a is in use in default config' . PHP_EOL, $this->tester->getDisplay() ); @@ -324,44 +324,48 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase true, false, ['theme' => ['frontend/Magento/a']], - 'Unable to uninstall. Please fix the following issues:' . PHP_EOL - . 'frontend/Magento/a is a parent of virtual theme' + 'Unable to uninstall. Please resolve the following issues:' . PHP_EOL + . 'frontend/Magento/a is a parent of virtual theme. Parent themes cannot be uninstalled.' ], [ true, false, ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], - 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . - 'frontend/Magento/a, frontend/Magento/b are parents of virtual theme' + 'Unable to uninstall. Please resolve the following issues:' . PHP_EOL . + 'frontend/Magento/a, frontend/Magento/b are parents of virtual theme.' + . ' Parent themes cannot be uninstalled.' ], [ false, true, ['theme' => ['frontend/Magento/a']], - 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . - 'frontend/Magento/a is a parent of physical theme' + 'Unable to uninstall. Please resolve the following issues:' . PHP_EOL . + 'frontend/Magento/a is a parent of physical theme. Parent themes cannot be uninstalled.' ], [ false, true, ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], - 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . - 'frontend/Magento/a, frontend/Magento/b are parents of physical theme' + 'Unable to uninstall. Please resolve the following issues:' . PHP_EOL . + 'frontend/Magento/a, frontend/Magento/b are parents of physical theme.' + . ' Parent themes cannot be uninstalled.' ], [ true, true, ['theme' => ['frontend/Magento/a']], - 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . - 'frontend/Magento/a is a parent of virtual theme' . PHP_EOL . - 'frontend/Magento/a is a parent of physical theme' + 'Unable to uninstall. Please resolve the following issues:' . PHP_EOL . + 'frontend/Magento/a is a parent of virtual theme. Parent themes cannot be uninstalled.' . PHP_EOL . + 'frontend/Magento/a is a parent of physical theme. Parent themes cannot be uninstalled.' ], [ true, true, ['theme' => ['frontend/Magento/a', 'frontend/Magento/b']], - 'frontend/Magento/a, frontend/Magento/b are parents of virtual theme' . PHP_EOL . - 'frontend/Magento/a, frontend/Magento/b are parents of physical theme' + 'frontend/Magento/a, frontend/Magento/b are parents of virtual theme.' + . ' Parent themes cannot be uninstalled.' . PHP_EOL . + 'frontend/Magento/a, frontend/Magento/b are parents of physical theme.' + . ' Parent themes cannot be uninstalled.' ], ]; } @@ -376,8 +380,8 @@ class ThemeUninstallCommandTest extends \PHPUnit_Framework_TestCase ->willReturn(['magento/theme-a' => ['magento/theme-b', 'magento/theme-c']]); $this->tester->execute(['theme' => ['frontend/Magento/a']]); $this->assertContains( - 'Unable to uninstall. Please fix the following issues:' . PHP_EOL . - 'frontend/Magento/a has the following package(s) depend on it:' + 'Unable to uninstall. Please resolve the following issues:' . PHP_EOL . + 'frontend/Magento/a has the following dependent package(s):' . PHP_EOL . "\tmagento/theme-b" . PHP_EOL . "\tmagento/theme-c", $this->tester->getDisplay() ); -- GitLab From ab3c369ce77f007bc67dac68a8c3f81d67ecc610 Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Tue, 23 Jun 2015 15:22:24 -0500 Subject: [PATCH 385/396] MAGETWO-38065: /magento_verion exposes too detailed version information - remove other version info from frontend and headers of HTTP requests to external resources --- .../Magento/Theme/view/frontend/templates/html/bugreport.phtml | 1 - .../Magento/Theme/view/frontend/templates/html/footer.phtml | 2 +- lib/internal/Magento/Framework/Filesystem/Driver/Http.php | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) 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 f81d5ae8386..1b984b454f0 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 d5e3ef78513..f158afa5e9c 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/lib/internal/Magento/Framework/Filesystem/Driver/Http.php b/lib/internal/Magento/Framework/Filesystem/Driver/Http.php index 2e60f74c6f1..c1fcedc96e6 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" . -- GitLab From 7466845871bc4d0bf2a18c6db49c9eb44b0a1463 Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Wed, 24 Jun 2015 13:03:51 +0300 Subject: [PATCH 386/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 61 +++++++++++++---------------------- lib/web/mage/apply/scripts.js | 27 ++++++---------- 2 files changed, 31 insertions(+), 57 deletions(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index a5b7909b1cb..e24d5d5873f 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -13,7 +13,7 @@ define([ nodeSelector = '[' + dataAttr + ']'; /** - * Initializes components assigned to a specfied element via data-* attribute. + * Initializes components assigned to a specified element via data-* attribute. * * @param {HTMLElement} el - Element to initialize components with. * @param {Object|String} config - Initial components' config. @@ -21,6 +21,7 @@ define([ */ function init(el, config, component) { require([component], function (fn) { + if (typeof fn === 'object') { fn = fn[component]; } @@ -32,31 +33,7 @@ define([ } }); } - /** - * Initializes mixins assigned to a specfied component. - * - * @param {Object} mixinList - object contains mixins list. - * @param {Object} itemContainer - object with component config and DOM element link. - * @return {Promise} - */ - function initMixins(mixinList, itemContainer){ - var configStack, - element = itemContainer.el, - result = $.Deferred(); - - _.each(mixinList, function (mixinArray, componentName) { - configStack = itemContainer.data[componentName]; - require(mixinArray, function(){ - for (var i = 0, len = arguments.length; i < len; i++){ - $.extend(true, configStack, arguments[i](configStack, element)); - } - - result.resolve(itemContainer); - }); - }); - return result; - } /** * Parses elements 'data-mage-init' attribute as a valid JSON data. * Note: data-mage-init attribute will be removed. @@ -90,21 +67,27 @@ define([ .map(getData) .concat(virtuals) .forEach(function (itemContainer) { - var mixins = itemContainer.data.mixins; - delete itemContainer.data.mixins; + var configStack, + element = itemContainer.el; + + _.each(itemContainer.data, function (obj, key) { + + if (obj.mixins) { + require(obj.mixins, function () { + for (var i = 0, len = arguments.length; i < len; i++) { + $.extend(true, itemContainer.data[key], arguments[i](itemContainer.data[key], element)); + } + + delete obj.mixins; + _.each(itemContainer.data, init.bind(null, element)); + }) + } else { + _.each(itemContainer.data, init.bind(null, element)); + } + + } + ); - if (mixins) { - $.when( - initMixins(mixins, itemContainer) - ).then(function (mergedItemContainer) { - _.each( - mergedItemContainer.data, - init.bind(null, mergedItemContainer.el) - ) - }); - } else { - _.each(itemContainer.data, init.bind(null, itemContainer.el)); - } }); }, applyFor: init diff --git a/lib/web/mage/apply/scripts.js b/lib/web/mage/apply/scripts.js index c7a9185054d..593d0bba6fd 100644 --- a/lib/web/mage/apply/scripts.js +++ b/lib/web/mage/apply/scripts.js @@ -28,39 +28,30 @@ define([ * Merges provided data with a current data * of a elements' "data-mage-init" attribute. * - * @param {Object} components - Object with compoenets and theirs configuration. + * @param {Object} components - Object with components and theirs configuration. * @param {HTMLElement} elem - Element whose data should be modified. */ function setData(components, elem) { - var data = elem.getAttribute(dataAttr), - iterator; + var data = elem.getAttribute(dataAttr); data = !!data ? JSON.parse(data) : {}; - - if(components.mixins) { - data.mixins = data.mixins || {}; - - for(iterator in components.mixins){ - if(!data.mixins[iterator]) { - data.mixins[iterator] = components.mixins[iterator].slice(); - }else { - data.mixins[iterator] = data.mixins[iterator].concat(components.mixins[iterator]); - } + _.each(components, function(obj, key) { + if (_.has(obj, 'mixins')) { + data[key].mixins = data[key].mixins || []; + data[key].mixins = data[key].mixins.concat(obj.mixins); + delete obj.mixins; } - - delete components.mixins; - } + }); data = $.extend(true, data, components); data = JSON.stringify(data); - elem.setAttribute(dataAttr, data); } /** * Search for the elements by privded selector and extends theirs data. * - * @param {Object} components - Object with compoenets and theirs configuration. + * @param {Object} components - Object with components and theirs configuration. * @param {String} selector - Selector for the elements. */ function processElems(components, selector) { -- GitLab From 69bab3c46c32ec4ec472b9062bef9beff419820d Mon Sep 17 00:00:00 2001 From: Ihor Melnychenko <imelnychenko@ebay.com> Date: Wed, 24 Jun 2015 13:18:35 +0300 Subject: [PATCH 387/396] MAGETWO-38867: Create mixin for declarative widget description --- lib/web/mage/apply/main.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/web/mage/apply/main.js b/lib/web/mage/apply/main.js index e24d5d5873f..37a12873c33 100644 --- a/lib/web/mage/apply/main.js +++ b/lib/web/mage/apply/main.js @@ -71,7 +71,6 @@ define([ element = itemContainer.el; _.each(itemContainer.data, function (obj, key) { - if (obj.mixins) { require(obj.mixins, function () { for (var i = 0, len = arguments.length; i < len; i++) { -- GitLab From 4ff3c6df1cb62adc57f07c02ab2a7fb2d0478d99 Mon Sep 17 00:00:00 2001 From: Evgeniy Kolesov <ikolesov@ebay.com> Date: Wed, 24 Jun 2015 14:17:08 +0300 Subject: [PATCH 388/396] MAGETWO-33536: M2 GitHub Update (version 0.74.0-beta14) --- .../AdvancedPricingImportExport/composer.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/AdvancedPricingImportExport/composer.json b/app/code/Magento/AdvancedPricingImportExport/composer.json index c8b52c1509e..3e7abff2e19 100644 --- a/app/code/Magento/AdvancedPricingImportExport/composer.json +++ b/app/code/Magento/AdvancedPricingImportExport/composer.json @@ -3,16 +3,16 @@ "description": "N/A", "require": { "php": "~5.5.0|~5.6.0", - "magento/module-catalog": "0.74.0-beta13", - "magento/module-import-export": "0.74.0-beta13", - "magento/module-catalog-import-export": "0.74.0-beta13", - "magento/module-customer": "0.74.0-beta13", - "magento/module-store": "0.74.0-beta13", - "magento/framework": "0.74.0-beta13", + "magento/module-catalog": "0.74.0-beta14", + "magento/module-import-export": "0.74.0-beta14", + "magento/module-catalog-import-export": "0.74.0-beta14", + "magento/module-customer": "0.74.0-beta14", + "magento/module-store": "0.74.0-beta14", + "magento/framework": "0.74.0-beta14", "magento/magento-composer-installer": "*" }, "type": "magento2-module", - "version": "0.74.0-beta13", + "version": "0.74.0-beta14", "license": [ "OSL-3.0", "AFL-3.0" -- GitLab From d60798ed3b0803685890eeb5dc7b447c9597e3f8 Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Wed, 24 Jun 2015 15:22:01 +0300 Subject: [PATCH 389/396] MAGETWO-39157: Cover \Magento\CatalogRule\Helper\Data with unit-test --- app/code/Magento/CatalogRule/Helper/Data.php | 3 +- .../CatalogRule/Test/Unit/Helper/DataTest.php | 68 +++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php diff --git a/app/code/Magento/CatalogRule/Helper/Data.php b/app/code/Magento/CatalogRule/Helper/Data.php index 439cff46006..33ff8836556 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/Test/Unit/Helper/DataTest.php b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php new file mode 100644 index 00000000000..2d72cd6c2c6 --- /dev/null +++ b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php @@ -0,0 +1,68 @@ +<?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], + ]; + } + +} -- GitLab From bcbc07082f9cef3fa88f07df8c13b8296a466a3e Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Wed, 24 Jun 2015 17:26:08 +0300 Subject: [PATCH 390/396] MAGETWO-38156: Move gift message to cart --- .../GiftMessage/Model/GiftMessageConfigProvider.php | 11 ++++++++++- .../view/frontend/web/js/model/gift-message.js | 10 ++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index eb4c83db358..431c1b8afbf 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -11,6 +11,7 @@ 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 "Checkout cart" page. @@ -49,6 +50,11 @@ class GiftMessageConfigProvider implements ConfigProviderInterface */ protected $localeFormat; + /** + * @var FormKey + */ + protected $formKey; + /** * @param \Magento\Framework\App\Helper\Context $context * @param \Magento\GiftMessage\Api\CartRepositoryInterface $cartRepository @@ -65,7 +71,8 @@ class GiftMessageConfigProvider implements ConfigProviderInterface \Magento\Checkout\Model\Session $checkoutSession, HttpContext $httpContext, \Magento\Store\Model\StoreManagerInterface $storeManager, - LocaleFormat $localeFormat + LocaleFormat $localeFormat, + FormKey $formKey ) { $this->scopeConfiguration = $context->getScopeConfig(); $this->cartRepository = $cartRepository; @@ -74,6 +81,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface $this->httpContext = $httpContext; $this->storeManager = $storeManager; $this->localeFormat = $localeFormat; + $this-> formKey = $formKey; } /** @@ -107,6 +115,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface ); $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) 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 eec30f4e610..ad91613b136 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,8 +3,8 @@ * See COPYING.txt for license details. */ /*global define*/ -define(['Magento_Ui/js/lib/component/provider', 'underscore'], - function (provider, _) { +define(['Magento_Ui/js/lib/component/provider', 'underscore', 'mage/url'], + function (provider, _, url) { "use strict"; return function (itemId) { var model = { @@ -65,6 +65,7 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], }, getAfterSubmitCallbacks: function() { var callbacks = []; + callbacks.push(this.afterSubmit); _.each(this.additionalOptions, function(option) { if (_.isFunction(option.afterSubmit)) { callbacks.push(option.afterSubmit); @@ -72,6 +73,11 @@ define(['Magento_Ui/js/lib/component/provider', 'underscore'], }); 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; -- GitLab From ccc1158a773097d0754c651863b2d38be8dfa849 Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Wed, 24 Jun 2015 19:00:44 +0300 Subject: [PATCH 391/396] MAGETWO-39187: Remove @codingStandardsIgnoreFile directive from code assigned to Troll team --- .../Controller/Adminhtml/Promo/Catalog.php | 13 +++- .../CatalogRule/Test/Unit/Model/CronTest.php | 26 +++++--- .../Test/Unit/Plugin/Indexer/CategoryTest.php | 51 ++++++++++----- .../Unit/Plugin/Indexer/CustomerGroupTest.php | 37 ++++++++--- .../Unit/Plugin/Indexer/ImportExportTest.php | 29 ++++++--- .../Test/Unit/Plugin/Indexer/WebsiteTest.php | 29 ++++++--- .../Test/Unit/Controller/Index/IndexTest.php | 18 ++++-- .../Test/Unit/Controller/IndexTest.php | 63 +++++++++--------- .../Contact/Test/Unit/Helper/DataTest.php | 22 +++++-- .../Model/Processor/InvalidateCacheTest.php | 47 ++++++++------ .../Reports/Block/Adminhtml/Filter/Form.php | 25 +++++--- .../Magento/Reports/Block/Adminhtml/Grid.php | 16 ++--- .../Block/Adminhtml/Grid/AbstractGrid.php | 4 ++ .../Grid/Column/Renderer/Currency.php | 8 +-- .../Block/Adminhtml/Sales/Invoiced/Grid.php | 17 +++-- .../Block/Adminhtml/Sales/Refunded/Grid.php | 17 +++-- .../Block/Adminhtml/Sales/Sales/Grid.php | 18 +++--- .../Block/Adminhtml/Sales/Shipping/Grid.php | 17 +++-- .../Block/Adminhtml/Sales/Tax/Grid.php | 21 +++--- .../Reports/Block/Adminhtml/Wishlist.php | 38 ++--------- .../Reports/Block/Product/Compared.php | 10 ++- .../Magento/Reports/Block/Product/Viewed.php | 13 ++-- app/code/Magento/Reports/Helper/Data.php | 12 ++-- .../Model/Resource/Order/Collection.php | 64 ++++++++++++++----- .../Resource/Product/Index/AbstractIndex.php | 16 +++-- .../Model/Resource/Report/AbstractReport.php | 18 ++++-- .../Model/Resource/Report/Product/Viewed.php | 8 ++- .../Magento/Reports/Setup/InstallData.php | 4 +- .../Collection/AbstractCollectionTest.php | 20 +++--- app/code/Magento/Rule/Model/AbstractModel.php | 8 ++- .../Condition/Product/AbstractProductTest.php | 28 +++++--- 31 files changed, 442 insertions(+), 275 deletions(-) diff --git a/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php b/app/code/Magento/CatalogRule/Controller/Adminhtml/Promo/Catalog.php index 3b20dec460b..5ab7a97bf4a 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,8 @@ 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.' + 'There are rules that have been changed but were not applied. ' + . 'Please, click Apply Rules in order to see immediate effect in the catalog.' ); return $this->_dirtyRulesNoticeMessage ? $this->_dirtyRulesNoticeMessage : $defaultMessage; } diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/CronTest.php index 07e27c6398a..2d8f4b8b8a6 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/Plugin/Indexer/CategoryTest.php b/app/code/Magento/CatalogRule/Test/Unit/Plugin/Indexer/CategoryTest.php index 4814767f39d..59bd89d0057 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 f0c7283f1d4..fb911fb1cdb 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 eac185dcc12..68a4dae5ef0 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 2fca372e8e4..39571d32c38 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/Contact/Test/Unit/Controller/Index/IndexTest.php b/app/code/Magento/Contact/Test/Unit/Controller/Index/IndexTest.php index bb59c0e78c7..ccaec64fabb 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 9db82a0300c..609eaddcc4b 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 cffd617f422..d95987107eb 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']; @@ -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/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php b/app/code/Magento/Indexer/Test/Unit/Model/Processor/InvalidateCacheTest.php index 29628de82f5..90c5606b85d 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/Reports/Block/Adminhtml/Filter/Form.php b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php index fa27e2dd1c1..63005ada548 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; /** @@ -18,30 +16,31 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic /** * Report type options * - * @var array + * @var [] */ protected $_reportTypeOptions = []; /** * Report field visibility * - * @var array + * @var [] */ protected $_fieldVisibility = []; /** * Report field opions * - * @var array + * @var [] */ protected $_fieldOptions = []; /** * Set field visibility - * @codeCoverageIgnore * * @param string $fieldId * @param bool $visibility + * + * @codeCoverageIgnore * @return void */ public function setFieldVisibility($fieldId, $visibility) @@ -113,7 +112,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 +132,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' => __('Match Period To') + ] ); $fieldset->addField( diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid.php index 3fd93b0d6b1..d47bd96fc9a 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; /** @@ -32,14 +30,14 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Filters array * - * @var array + * @var [] */ protected $_filters = []; /** * Default filters values * - * @var array + * @var [] */ protected $_defaultFilters = ['report_from' => '', 'report_to' => '', 'report_period' => 'day']; @@ -53,7 +51,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Errors messages aggregated array * - * @var array + * @var [] */ protected $_errors = []; @@ -67,7 +65,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Filter values array * - * @var array + * @var [] */ protected $_filterValues; @@ -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() { @@ -203,9 +201,9 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set visibility of store switcher - * @codeCoverageIgnore * * @param bool $visible + * @codeCoverageIgnore * @return void */ public function setStoreSwitcherVisibility($visible = true) diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php index 0d457a21808..41a277f9b69 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php @@ -71,6 +71,8 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** + * Pseudo constructor + * * @return void */ protected function _construct() @@ -86,6 +88,8 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended } /** + * Get resource collection name + * * @codeCoverageIgnore * * @return string 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 ac9cf8c700b..30555dbca8d 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/Sales/Invoiced/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php index 414c2e77587..a74edde82b6 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,14 @@ 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} */ protected function _construct() { @@ -31,18 +31,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/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php index e5f68a315f7..ec6cd002e21 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,14 @@ 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} */ protected function _construct() { @@ -31,18 +31,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/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php index 012e170b2c2..98e09bede80 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,14 @@ 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} */ protected function _construct() { @@ -31,18 +31,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/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php index ee594aaa344..3ce177f0394 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,14 @@ 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} */ protected function _construct() { @@ -32,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_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/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php index 48c3a647299..c55d866d32c 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,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid } /** - * @return void + * {@inheritdoc} */ protected function _construct() { @@ -59,18 +63,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 690c98b4d69..f810a435a6c 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; /** @@ -15,36 +13,6 @@ 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; - /** * @var string */ @@ -58,6 +26,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 +42,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/Compared.php b/app/code/Magento/Reports/Block/Product/Compared.php index 6693d0053ea..67e3d641b82 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 947c90c8950..9e03d65dd7c 100644 --- a/app/code/Magento/Reports/Block/Product/Viewed.php +++ b/app/code/Magento/Reports/Block/Product/Viewed.php @@ -4,8 +4,6 @@ * See COPYING.txt for license details. */ -// @codingStandardsIgnoreFile - namespace Magento\Reports\Block\Product; /** @@ -13,8 +11,12 @@ namespace Magento\Reports\Block\Product; * * @author Magento Core Team <core@magentocommerce.com> */ -class Viewed extends \Magento\Reports\Block\Product\AbstractProduct implements \Magento\Framework\Object\IdentityInterface +class Viewed extends \Magento\Reports\Block\Product\AbstractProduct + implements \Magento\Framework\Object\IdentityInterface { + /** + * Config path to recently viewed product count + */ const XML_PATH_RECENTLY_VIEWED_COUNT = 'catalog/recently_products/viewed_count'; /** @@ -34,7 +36,10 @@ class Viewed extends \Magento\Reports\Block\Product\AbstractProduct implements \ if ($this->hasData('page_size')) { return $this->getData('page_size'); } - return $this->_scopeConfig->getValue(self::XML_PATH_RECENTLY_VIEWED_COUNT, \Magento\Store\Model\ScopeInterface::SCOPE_STORE); + return $this->_scopeConfig->getValue( + self::XML_PATH_RECENTLY_VIEWED_COUNT, + \Magento\Store\Model\ScopeInterface::SCOPE_STORE + ); } /** diff --git a/app/code/Magento/Reports/Helper/Data.php b/app/code/Magento/Reports/Helper/Data.php index b81544d5e7a..c33b0791a55 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; } diff --git a/app/code/Magento/Reports/Model/Resource/Order/Collection.php b/app/code/Magento/Reports/Model/Resource/Order/Collection.php index 60b24016381..5ab7ce03f2e 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 @@ -162,7 +170,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 +265,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 +279,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 +357,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 +673,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 +786,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 +805,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 +898,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/Index/AbstractIndex.php b/app/code/Magento/Reports/Model/Resource/Product/Index/AbstractIndex.php index 52d72406cb1..45b1c2c5e9d 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/Report/AbstractReport.php b/app/code/Magento/Reports/Model/Resource/Report/AbstractReport.php index 84a6d7d6a25..777d13232b2 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/Product/Viewed.php b/app/code/Magento/Reports/Model/Resource/Report/Product/Viewed.php index 56e658e56db..432ebc9b5d4 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/Setup/InstallData.php b/app/code/Magento/Reports/Setup/InstallData.php index 071ed7c2964..fef292ffb21 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/Model/Resource/Report/Collection/AbstractCollectionTest.php b/app/code/Magento/Reports/Test/Unit/Model/Resource/Report/Collection/AbstractCollectionTest.php index 96ad13c9b21..ed5075a8bf7 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/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php index 8aedb81590e..e343115e297 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 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 32d0b012c88..41b09160214 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; @@ -306,7 +310,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 +321,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 +349,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 +372,8 @@ class AbstractProductTest extends \PHPUnit_Framework_TestCase } /** + * Data provider for prepare value options + * * @return array * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ -- GitLab From 6e11c9bdd374b95458334f4953263814dcda97f7 Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Wed, 24 Jun 2015 20:02:52 +0300 Subject: [PATCH 392/396] MAGETWO-39187: Remove @codingStandardsIgnoreFile directive from code assigned to Troll team - CR changes --- app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php | 1 - app/code/Magento/Contact/Test/Unit/Helper/DataTest.php | 2 +- app/code/Magento/Reports/Block/Product/Viewed.php | 4 ++-- app/code/Magento/Rule/Model/AbstractModel.php | 4 ++-- .../Unit/Model/Condition/Product/AbstractProductTest.php | 6 ++++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php index 2d72cd6c2c6..0d75d688a07 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Helper/DataTest.php @@ -64,5 +64,4 @@ class DataTest extends \PHPUnit_Framework_TestCase ['by_percent', 1, 10, 9.90], ]; } - } diff --git a/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php b/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php index d95987107eb..057cc4672ac 100644 --- a/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php +++ b/app/code/Magento/Contact/Test/Unit/Helper/DataTest.php @@ -66,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() diff --git a/app/code/Magento/Reports/Block/Product/Viewed.php b/app/code/Magento/Reports/Block/Product/Viewed.php index 9e03d65dd7c..5c44e6f125d 100644 --- a/app/code/Magento/Reports/Block/Product/Viewed.php +++ b/app/code/Magento/Reports/Block/Product/Viewed.php @@ -6,13 +6,13 @@ 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 diff --git a/app/code/Magento/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php index e343115e297..bfbc5e8b304 100644 --- a/app/code/Magento/Rule/Model/AbstractModel.php +++ b/app/code/Magento/Rule/Model/AbstractModel.php @@ -237,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'); @@ -254,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'); 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 41b09160214..7c628927f6c 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 @@ -163,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'); -- GitLab From e9cc35caab13db60d67ca06d192bba0507a4c43d Mon Sep 17 00:00:00 2001 From: Dale Sikkema <dsikkema@ebay.com> Date: Wed, 24 Jun 2015 15:22:08 -0500 Subject: [PATCH 393/396] MAGETWO-37848: Generate data fails when table prefix exceeds length of 5 --- .../Framework/DB/Test/Unit/ExpressionConverterTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php index a184d739591..5c122c497cf 100644 --- a/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php +++ b/lib/internal/Magento/Framework/DB/Test/Unit/ExpressionConverterTest.php @@ -39,9 +39,9 @@ class ExpressionConverterTest extends \PHPUnit_Framework_TestCase 'pre_' ], 'Abbreviated identifier' => [ - $length40 . 'enterprise_notification_index', + $length40 . 'downloadable_notification_index', 'pre_', - $length40 . 'ent_ntfc_idx' + $length40 . 'dl_ntfc_idx' ], ]; } -- GitLab From 818895f645447418f027065e310a1f172a3d4bf8 Mon Sep 17 00:00:00 2001 From: Olga Kopylova <okopylova@ebay.com> Date: Wed, 24 Jun 2015 18:04:43 -0500 Subject: [PATCH 394/396] MAGETWO-39191: Contribution of bugs/tasks in Sprint 32 - fixed randomly failed integration test --- .../Magento/Framework/Search/Adapter/Mysql/AdapterTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php b/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php index f378bb929e0..619996d9efc 100644 --- a/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php +++ b/dev/tests/integration/testsuite/Magento/Framework/Search/Adapter/Mysql/AdapterTest.php @@ -276,6 +276,7 @@ class AdapterTest extends \PHPUnit_Framework_TestCase /** @var \Magento\Framework\Search\Document $document */ $actualIds[] = $document->getId(); } + sort($actualIds); $this->assertEquals($expectedIds, $actualIds); } -- GitLab From 8b354bcae4d391b6f2af4341587b44bc139dadea Mon Sep 17 00:00:00 2001 From: Roman Ganin <rganin@ebay.com> Date: Thu, 25 Jun 2015 12:09:56 +0300 Subject: [PATCH 395/396] MAGETWO-39187: Remove @codingStandardsIgnoreFile directive from code assigned to Troll team - CR changes --- .../Reports/Block/Adminhtml/Filter/Form.php | 7 ++++--- .../Magento/Reports/Block/Adminhtml/Grid.php | 16 ++++++++-------- .../Block/Adminhtml/Grid/AbstractGrid.php | 3 ++- .../Magento/Reports/Block/Adminhtml/Product.php | 2 +- .../Block/Adminhtml/Sales/Bestsellers.php | 6 +++++- .../Block/Adminhtml/Sales/Bestsellers/Grid.php | 10 +++++++--- .../Reports/Block/Adminhtml/Sales/Coupons.php | 6 +++++- .../Block/Adminhtml/Sales/Coupons/Grid.php | 9 ++++++--- .../Sales/Grid/Column/Renderer/Date.php | 2 ++ .../Reports/Block/Adminhtml/Sales/Invoiced.php | 6 +++++- .../Block/Adminhtml/Sales/Invoiced/Grid.php | 1 + .../Reports/Block/Adminhtml/Sales/Refunded.php | 6 +++++- .../Block/Adminhtml/Sales/Refunded/Grid.php | 1 + .../Reports/Block/Adminhtml/Sales/Sales.php | 6 +++++- .../Reports/Block/Adminhtml/Sales/Sales/Grid.php | 1 + .../Reports/Block/Adminhtml/Sales/Shipping.php | 6 +++++- .../Block/Adminhtml/Sales/Shipping/Grid.php | 1 + .../Reports/Block/Adminhtml/Sales/Tax.php | 6 +++++- .../Reports/Block/Adminhtml/Sales/Tax/Grid.php | 1 + .../Magento/Reports/Block/Adminhtml/Wishlist.php | 2 ++ .../Magento/Reports/Block/Product/Viewed.php | 1 + .../Reports/Model/Resource/Order/Collection.php | 1 + .../Model/Resource/Product/Index/Viewed.php | 1 + app/code/Magento/Rule/Model/AbstractModel.php | 4 ++++ 24 files changed, 79 insertions(+), 26 deletions(-) diff --git a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php index 63005ada548..f9fe3f72904 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Filter/Form.php @@ -16,21 +16,21 @@ class Form extends \Magento\Backend\Block\Widget\Form\Generic /** * Report type options * - * @var [] + * @var array */ protected $_reportTypeOptions = []; /** * Report field visibility * - * @var [] + * @var array */ protected $_fieldVisibility = []; /** * Report field opions * - * @var [] + * @var array */ protected $_fieldOptions = []; @@ -94,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) { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Grid.php b/app/code/Magento/Reports/Block/Adminhtml/Grid.php index d47bd96fc9a..463339d2949 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid.php @@ -30,14 +30,14 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Filters array * - * @var [] + * @var array */ protected $_filters = []; /** * Default filters values * - * @var [] + * @var array */ protected $_defaultFilters = ['report_from' => '', 'report_to' => '', 'report_period' => 'day']; @@ -51,7 +51,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Errors messages aggregated array * - * @var [] + * @var array */ protected $_errors = []; @@ -65,7 +65,7 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Filter values array * - * @var [] + * @var array */ protected $_filterValues; @@ -236,10 +236,10 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set visibility of date filter - * @codeCoverageIgnore * * @param bool $visible * @return void + * @codeCoverageIgnore */ public function setDateFilterVisibility($visible = true) { @@ -302,11 +302,11 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set filter - * @codeCoverageIgnore * * @param string $name * @param string $value * @return void + * @codeCoverageIgnore */ public function setFilter($name, $value) { @@ -332,10 +332,10 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Set sub-report rows count - * @codeCoverageIgnore * * @param int $size * @return void + * @codeCoverageIgnore */ public function setSubReportSize($size) { @@ -355,9 +355,9 @@ class Grid extends \Magento\Backend\Block\Widget\Grid /** * Retrieve errors - * @codeCoverageIgnore * * @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 41a277f9b69..39813ec4894 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Grid/AbstractGrid.php @@ -346,10 +346,10 @@ class AbstractGrid extends \Magento\Backend\Block\Widget\Grid\Extended /** * StoreIds setter - * @codeCoverageIgnore * * @param array $storeIds * @return $this + * @codeCoverageIgnore */ public function setStoreIds($storeIds) { @@ -404,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/Product.php b/app/code/Magento/Reports/Block/Adminhtml/Product.php index 9c5cad9fc76..4adc6dccbc0 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 d872439b7f8..32a25599702 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 d6820a81197..bedef6d74ac 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 c14f1c248b1..cfd20f5e3a4 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 c04265b1c53..cf79f4c0668 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 b18faf62ef5..30b6fccb134 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 3b6cf458465..e6de75fb954 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 a74edde82b6..854520bafad 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Invoiced/Grid.php @@ -23,6 +23,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid /** * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded.php index 6ff26a3822b..c48dee92771 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 ec6cd002e21..c3964e9675c 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Refunded/Grid.php @@ -23,6 +23,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid /** * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales.php index 6c6ca70730a..ad43f74e526 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 98e09bede80..6f7b99bb894 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Sales/Grid.php @@ -23,6 +23,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid /** * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping.php index 0499c0ee07a..e72406788d3 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 3ce177f0394..28d8bbe6b19 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Shipping/Grid.php @@ -23,6 +23,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid /** * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax.php index 767760eabb6..ed27f161651 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 c55d866d32c..7196f1ff332 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Sales/Tax/Grid.php @@ -54,6 +54,7 @@ class Grid extends \Magento\Reports\Block\Adminhtml\Grid\AbstractGrid /** * {@inheritdoc} + * @codeCoverageIgnore */ protected function _construct() { diff --git a/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php b/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php index f810a435a6c..df114f5e653 100644 --- a/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php +++ b/app/code/Magento/Reports/Block/Adminhtml/Wishlist.php @@ -14,6 +14,8 @@ namespace Magento\Reports\Block\Adminhtml; class Wishlist extends \Magento\Backend\Block\Template { /** + * Template file + * * @var string */ protected $_template = 'report/wishlist.phtml'; diff --git a/app/code/Magento/Reports/Block/Product/Viewed.php b/app/code/Magento/Reports/Block/Product/Viewed.php index 5c44e6f125d..9a689ec5a6d 100644 --- a/app/code/Magento/Reports/Block/Product/Viewed.php +++ b/app/code/Magento/Reports/Block/Product/Viewed.php @@ -7,6 +7,7 @@ namespace Magento\Reports\Block\Product; use \Magento\Framework\Object\IdentityInterface; + /** * Reports Recently Viewed Products Block * diff --git a/app/code/Magento/Reports/Model/Resource/Order/Collection.php b/app/code/Magento/Reports/Model/Resource/Order/Collection.php index 5ab7ce03f2e..07c2e2aa8c4 100644 --- a/app/code/Magento/Reports/Model/Resource/Order/Collection.php +++ b/app/code/Magento/Reports/Model/Resource/Order/Collection.php @@ -136,6 +136,7 @@ class Collection extends \Magento\Sales\Model\Resource\Order\Collection * Retrieve is live flag for rep * * @return bool + * @codeCoverageIgnore */ public function isLive() { 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 0ad3ffd330f..93a22cf0011 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/Rule/Model/AbstractModel.php b/app/code/Magento/Rule/Model/AbstractModel.php index bfbc5e8b304..ce15aad634b 100644 --- a/app/code/Magento/Rule/Model/AbstractModel.php +++ b/app/code/Magento/Rule/Model/AbstractModel.php @@ -394,6 +394,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * Check availability to delete rule * * @return bool + * @codeCoverageIgnore */ public function isDeleteable() { @@ -405,6 +406,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * * @param bool $value * @return $this + * @codeCoverageIgnore */ public function setIsDeleteable($value) { @@ -416,6 +418,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * Check if rule is readonly * * @return bool + * @codeCoverageIgnore */ public function isReadonly() { @@ -427,6 +430,7 @@ abstract class AbstractModel extends \Magento\Framework\Model\AbstractModel * * @param bool $value * @return $this + * @codeCoverageIgnore */ public function setIsReadonly($value) { -- GitLab From 8bd029f68048e2c5f7fe830ad13d08c227f12e22 Mon Sep 17 00:00:00 2001 From: okarpenko <okarpenko@ebay.com> Date: Thu, 25 Jun 2015 15:55:07 +0300 Subject: [PATCH 396/396] MAGETWO-38156: Move gift message to cart --- app/code/Magento/Checkout/composer.json | 1 - app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Checkout/composer.json b/app/code/Magento/Checkout/composer.json index 7aac4e4eeb3..572909061f9 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/GiftMessage/Model/GiftMessageConfigProvider.php b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php index 431c1b8afbf..18d2b55950c 100644 --- a/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php +++ b/app/code/Magento/GiftMessage/Model/GiftMessageConfigProvider.php @@ -63,6 +63,7 @@ class GiftMessageConfigProvider implements ConfigProviderInterface * @param HttpContext $httpContext * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param LocaleFormat $localeFormat + * @param FormKey $formKey */ public function __construct( \Magento\Framework\App\Helper\Context $context, -- GitLab