diff --git a/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php b/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php
index df5894bf4cbd1..20bd1b379beef 100644
--- a/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php
+++ b/app/code/Magento/Catalog/Block/Adminhtml/Category/Tab/Product.php
@@ -14,6 +14,9 @@
use Magento\Backend\Block\Widget\Grid;
use Magento\Backend\Block\Widget\Grid\Column;
use Magento\Backend\Block\Widget\Grid\Extended;
+use Magento\Catalog\Model\Product\Attribute\Source\Status;
+use Magento\Catalog\Model\Product\Visibility;
+use Magento\Framework\App\ObjectManager;
class Product extends \Magento\Backend\Block\Widget\Grid\Extended
{
@@ -29,22 +32,38 @@ class Product extends \Magento\Backend\Block\Widget\Grid\Extended
*/
protected $_productFactory;
+ /**
+ * @var Status
+ */
+ private $status;
+
+ /**
+ * @var Visibility
+ */
+ private $visibility;
+
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Helper\Data $backendHelper
* @param \Magento\Catalog\Model\ProductFactory $productFactory
* @param \Magento\Framework\Registry $coreRegistry
* @param array $data
+ * @param Visibility|null $visibility
+ * @param Status|null $status
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Helper\Data $backendHelper,
\Magento\Catalog\Model\ProductFactory $productFactory,
\Magento\Framework\Registry $coreRegistry,
- array $data = []
+ array $data = [],
+ Visibility $visibility = null,
+ Status $status = null
) {
$this->_productFactory = $productFactory;
$this->_coreRegistry = $coreRegistry;
+ $this->visibility = $visibility ?: ObjectManager::getInstance()->get(Visibility::class);
+ $this->status = $status ?: ObjectManager::getInstance()->get(Status::class);
parent::__construct($context, $backendHelper, $data);
}
@@ -102,6 +121,10 @@ protected function _prepareCollection()
'name'
)->addAttributeToSelect(
'sku'
+ )->addAttributeToSelect(
+ 'visibility'
+ )->addAttributeToSelect(
+ 'status'
)->addAttributeToSelect(
'price'
)->joinField(
@@ -159,6 +182,28 @@ protected function _prepareColumns()
);
$this->addColumn('name', ['header' => __('Name'), 'index' => 'name']);
$this->addColumn('sku', ['header' => __('SKU'), 'index' => 'sku']);
+ $this->addColumn(
+ 'visibility',
+ [
+ 'header' => __('Visibility'),
+ 'index' => 'visibility',
+ 'type' => 'options',
+ 'options' => $this->visibility->getOptionArray(),
+ 'header_css_class' => 'col-visibility',
+ 'column_css_class' => 'col-visibility'
+ ]
+ );
+
+ $this->addColumn(
+ 'status',
+ [
+ 'header' => __('Status'),
+ 'index' => 'status',
+ 'type' => 'options',
+ 'options' => $this->status->getOptionArray()
+ ]
+ );
+
$this->addColumn(
'price',
[
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php
index 19033094c1fb7..6dd6c6c863da5 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Block/Adminhtml/Category/Edit/Section/ProductGrid.php
@@ -29,6 +29,14 @@ class ProductGrid extends Grid
'name' => [
'selector' => '#catalog_category_products_filter_name',
],
+ 'visibility' => [
+ 'selector' => '#catalog_category_products_filter_visibility',
+ 'input' => 'select',
+ ],
+ 'status' => [
+ 'selector' => '#catalog_category_products_filter_status',
+ 'input' => 'select',
+ ],
];
/**
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategoryProductsGridFilter.php b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategoryProductsGridFilter.php
new file mode 100644
index 0000000000000..2cc67271abca4
--- /dev/null
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/Constraint/AssertCategoryProductsGridFilter.php
@@ -0,0 +1,99 @@
+getTreeCategories()->selectCategory($category, true);
+ $categoryProducts = $category->getDataFieldConfig('category_products')['source']->getProducts();
+ $catalogCategoryEdit->getEditForm()->openSection('category_products');
+
+ foreach ($this->testFilterColumns as $field) {
+ $this->testGridFilter($categoryProducts, $catalogCategoryEdit, $field);
+ }
+ }
+
+ /**
+ * @param array $categoryProducts
+ * @param CatalogCategoryEdit $catalogCategoryEdit
+ * @param string $filterField
+ */
+ private function testGridFilter(array $categoryProducts, CatalogCategoryEdit $catalogCategoryEdit, $filterField)
+ {
+ $productsByFilter = [];
+ foreach ($categoryProducts as $product) {
+ $filterValue = $product->getData($filterField);
+ if (!isset($productsByFilter[$filterValue])) {
+ $productsByFilter[$filterValue] = [];
+ }
+ $productsByFilter[$filterValue][] = $product;
+ }
+
+ $productsFieldset = $catalogCategoryEdit->getEditForm()->getSection('category_products');
+ foreach ($productsByFilter as $filterValue => $products) {
+ $productsFieldset->getProductGrid()->search([
+ 'in_category' => 'Yes',
+ $filterField => $filterValue,
+ ]);
+
+ $expectedRows = [];
+ foreach ($products as $product) {
+ $expectedRows[] = $product->getName();
+ }
+ $gridRows = $productsFieldset->getProductGrid()->getRowsData(['name']);
+ $actualRows = array_column($gridRows, 'name');
+ sort($expectedRows);
+ sort($actualRows);
+
+ \PHPUnit_Framework_Assert::assertEquals(
+ $expectedRows,
+ $actualRows,
+ "Category products grid filter '$filterField' does not work correctly"
+ );
+ }
+ }
+
+ /**
+ * Returns a string representation of the object.
+ *
+ * @return string
+ */
+ public function toString()
+ {
+ return 'Category products grid filter works correctly';
+ }
+}
diff --git a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml
index b10a47b63508c..a840b81a5d206 100644
--- a/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml
+++ b/dev/tests/functional/tests/app/Magento/Catalog/Test/TestCase/Category/CreateCategoryEntityTest.xml
@@ -175,5 +175,15 @@
+
+ addSubcategory
+ default_category
+ Yes
+ Yes
+ Subcategory%isolation%
+ catalogProductSimple::default, catalogProductSimple::not_visible_individually
+
+
+