From 940c98526e7a0228ee02bb03470fdd6f470e04e8 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 18 Aug 2023 14:49:21 +0200 Subject: [PATCH 01/92] WIP --- .../Adminhtml/Block/Catalog/Product/Grid.php | 23 ++++-- .../Adminhtml/Block/Widget/Grid/Column.php | 3 + .../Widget/Grid/Column/Renderer/Image.php | 80 +++++++++++++++++++ 3 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php index 496a8510849..31a44897198 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php @@ -46,11 +46,11 @@ protected function _prepareCollection() { $store = $this->_getStore(); $collection = Mage::getModel('catalog/product')->getCollection() - ->addAttributeToSelect('sku') - ->addAttributeToSelect('name') - ->addAttributeToSelect('attribute_set_id') - ->addAttributeToSelect('type_id'); - + ->addAttributeToSelect('sku') + ->addAttributeToSelect('name') + ->addAttributeToSelect('attribute_set_id') + ->addAttributeToSelect('type_id'); + if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) { $collection->joinField( 'qty', @@ -61,6 +61,9 @@ protected function _prepareCollection() 'left' ); } + + $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); + if ($store->getId()) { //$collection->setStoreId($store->getId()); $adminStore = Mage_Core_Model_App::ADMIN_STORE_ID; @@ -151,6 +154,16 @@ protected function _prepareColumns() 'index' => 'entity_id', ] ); + + $this->addColumn( + 'image', + [ + 'header' => Mage::helper('catalog')->__('Image'), + 'type' => 'image', + 'index' => 'image', + ] + ); + $this->addColumn( 'name', [ diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php index 86e6e99aa3f..0317540faaa 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php @@ -288,6 +288,9 @@ protected function _getRendererByType() case 'theme': $rendererClass = 'adminhtml/widget_grid_column_renderer_theme'; break; + case 'image': + $rendererClass = 'adminhtml/widget_grid_column_renderer_image'; + break; default: $rendererClass = 'adminhtml/widget_grid_column_renderer_text'; break; diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php new file mode 100644 index 00000000000..98779f9d3c5 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php @@ -0,0 +1,80 @@ +init($dummyProduct, $this->getColumn()->getAttributeCode(), $image); + } + + private function _checkImageIsSelected($row) + { + $value = $this->_getValue($row); + if (!$value || $value == 'no_selection') return false; + return $value; + } + + public function render(Varien_Object $row) + { + $result = ''; + + $imageWidth = intval($this->getColumn()->getImageWidth()) > 0 ?: 128; + $imageHeight = intval($this->getColumn()->getImageHeight()) > 0 ?: 128; + + $image = $this->_checkImageIsSelected($row); + if ($image) { + + $imageSrc = $this->_getHelperImage($image) + ->resize($imageWidth, $imageHeight); + $imageUrl = Mage::getBaseUrl('media') . 'catalog/product/' . $image; + + $result .= ''; + $result .= '' . basename($imageUrl) . ''; + $result .= ''; + + }/* else { + return ''; + } */ + + return $result; + } + + public function renderExport(Varien_Object $row) + { + $image = $this->_checkImageIsSelected($row); + if ($image) { + return Mage::getBaseUrl('media') . 'catalog/product/' . $image; + } else { + return ''; + } + } + + public function renderCss() + { + return 'a-center'; + } +} From 15ab51bda97c0d4ecf3c550719dca443097538fa Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 18 Aug 2023 15:01:29 +0200 Subject: [PATCH 02/92] add to category product --- .../Adminhtml/Block/Catalog/Category/Tab/Product.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php index e3a93f0674a..97ef3b94d9a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php @@ -83,6 +83,8 @@ protected function _prepareCollection() 'category_id=' . (int) $this->getRequest()->getParam('id', 0), 'left' ); + $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); + $this->setCollection($collection); if ($this->getCategory()->getProductsReadonly()) { @@ -118,6 +120,14 @@ protected function _prepareColumns() 'width' => '60', 'index' => 'entity_id' ]); + $this->addColumn( + 'image', + [ + 'header' => Mage::helper('catalog')->__('Image'), + 'type' => 'image', + 'index' => 'image', + ] + ); $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' From 462f18256129b213b7d6155a947c0b1585b3904b Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 18 Aug 2023 15:03:30 +0200 Subject: [PATCH 03/92] add to related upsell crossell --- .../Block/Catalog/Product/Edit/Tab/Crosssell.php | 11 +++++++++++ .../Block/Catalog/Product/Edit/Tab/Related.php | 11 +++++++++++ .../Block/Catalog/Product/Edit/Tab/Upsell.php | 12 ++++++++++++ 3 files changed, 34 insertions(+) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php index d9d3339f9dc..b6ff8c8a492 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php @@ -95,6 +95,8 @@ protected function _prepareCollection() $collection->addFieldToFilter('entity_id', ['in' => $productIds]); } + $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); + $this->setCollection($collection); return parent::_prepareCollection(); @@ -133,6 +135,15 @@ protected function _prepareColumns() 'index' => 'entity_id' ]); + $this->addColumn( + 'image', + [ + 'header' => Mage::helper('catalog')->__('Image'), + 'type' => 'image', + 'index' => 'image', + ] + ); + $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php index 791c054c05e..63aebc73a20 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php @@ -96,6 +96,8 @@ protected function _prepareCollection() $collection->addFieldToFilter('entity_id', ['in' => $productIds]); } + $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); + $this->setCollection($collection); return parent::_prepareCollection(); } @@ -135,6 +137,15 @@ protected function _prepareColumns() 'index' => 'entity_id' ]); + $this->addColumn( + 'image', + [ + 'header' => Mage::helper('catalog')->__('Image'), + 'type' => 'image', + 'index' => 'image', + ] + ); + $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php index c62487dc770..45ccc625220 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php @@ -106,6 +106,8 @@ protected function _prepareCollection() $collection->addFieldToFilter('entity_id', ['in' => $productIds]); } + $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); + $this->setCollection($collection); return parent::_prepareCollection(); } @@ -134,6 +136,16 @@ protected function _prepareColumns() 'width' => 60, 'index' => 'entity_id' ]); + + $this->addColumn( + 'image', + [ + 'header' => Mage::helper('catalog')->__('Image'), + 'type' => 'image', + 'index' => 'image', + ] + ); + $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' From 4743493a7dc363b01816102be9c9edcaf19c03f7 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 18 Aug 2023 15:08:48 +0200 Subject: [PATCH 04/92] set fixed width --- .../Widget/Grid/Column/Renderer/Image.php | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php index 98779f9d3c5..a38aeb09d8e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php @@ -23,33 +23,17 @@ class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Image extends Mage_Adminh { protected $_defaultWidth = 128; - - protected function _getHelperImage($image) - { - $dummyProduct = Mage::getModel('catalog/product'); - return Mage::helper('catalog/image') - ->init($dummyProduct, $this->getColumn()->getAttributeCode(), $image); - } - - private function _checkImageIsSelected($row) - { - $value = $this->_getValue($row); - if (!$value || $value == 'no_selection') return false; - return $value; - } public function render(Varien_Object $row) { $result = ''; - $imageWidth = intval($this->getColumn()->getImageWidth()) > 0 ?: 128; - $imageHeight = intval($this->getColumn()->getImageHeight()) > 0 ?: 128; - $image = $this->_checkImageIsSelected($row); if ($image) { + $imageDimensions = $this->getColumn()->getWidth() ?: $this->_defaultWidth; $imageSrc = $this->_getHelperImage($image) - ->resize($imageWidth, $imageHeight); + ->resize($imageDimensions, $imageDimensions); $imageUrl = Mage::getBaseUrl('media') . 'catalog/product/' . $image; $result .= ''; @@ -77,4 +61,18 @@ public function renderCss() { return 'a-center'; } + + protected function _getHelperImage($image) + { + $dummyProduct = Mage::getModel('catalog/product'); + return Mage::helper('catalog/image') + ->init($dummyProduct, $this->getColumn()->getAttributeCode(), $image); + } + + private function _checkImageIsSelected($row) + { + $value = $this->_getValue($row); + if (!$value || $value == 'no_selection') return false; + return $value; + } } From 73398a46cc557cd24d18e4d13a74da0199a35a4f Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:00:18 +0200 Subject: [PATCH 05/92] clean --- app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php index 31a44897198..600d83e5e17 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php @@ -50,7 +50,7 @@ protected function _prepareCollection() ->addAttributeToSelect('name') ->addAttributeToSelect('attribute_set_id') ->addAttributeToSelect('type_id'); - + if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) { $collection->joinField( 'qty', From f74e4eedf291f4887cf86d705f032a2777675755 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:03:42 +0200 Subject: [PATCH 06/92] clean --- .../Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php index a38aeb09d8e..ac31a824ce1 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php @@ -26,10 +26,9 @@ class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Image extends Mage_Adminh public function render(Varien_Object $row) { - $result = ''; - $image = $this->_checkImageIsSelected($row); if ($image) { + $result = ''; $imageDimensions = $this->getColumn()->getWidth() ?: $this->_defaultWidth; $imageSrc = $this->_getHelperImage($image) @@ -39,7 +38,6 @@ public function render(Varien_Object $row) $result .= ''; $result .= '' . basename($imageUrl) . ''; $result .= ''; - }/* else { return ''; } */ From 716310fa1ca79cc4e16b91279d4688610ca43f43 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:12:03 +0200 Subject: [PATCH 07/92] cosmetic --- .../Widget/Grid/Column/Renderer/Image.php | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php index ac31a824ce1..70abe31ef4a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php @@ -27,32 +27,28 @@ class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Image extends Mage_Adminh public function render(Varien_Object $row) { $image = $this->_checkImageIsSelected($row); - if ($image) { - $result = ''; - $imageDimensions = $this->getColumn()->getWidth() ?: $this->_defaultWidth; - - $imageSrc = $this->_getHelperImage($image) - ->resize($imageDimensions, $imageDimensions); - $imageUrl = Mage::getBaseUrl('media') . 'catalog/product/' . $image; - - $result .= ''; - $result .= '' . basename($imageUrl) . ''; - $result .= ''; - }/* else { - return ''; - } */ - + if (!$image) { + return ''; + //return ''; + } + $imageDimensions = $this->getColumn()->getWidth() ?: $this->_defaultWidth; + $imageSrc = $this->_getHelperImage($image) + ->resize($imageDimensions, $imageDimensions); + $imageUrl = $this->_getImageUrl($image); + $result = ''; + $result .= ''; + $result .= '' . basename($imageUrl) . ''; + $result .= ''; return $result; } - public function renderExport(Varien_Object $row) + public function renderExport(Varien_Object $row) : string { $image = $this->_checkImageIsSelected($row); - if ($image) { - return Mage::getBaseUrl('media') . 'catalog/product/' . $image; - } else { + if (!$image) { return ''; } + return $this->_getImageUrl($image); } public function renderCss() @@ -60,14 +56,20 @@ public function renderCss() return 'a-center'; } - protected function _getHelperImage($image) + protected function _getHelperImage($image) : Mage_Catalog_Helper_Image { $dummyProduct = Mage::getModel('catalog/product'); - return Mage::helper('catalog/image') - ->init($dummyProduct, $this->getColumn()->getAttributeCode(), $image); + return Mage::helper('catalog/image')->init($dummyProduct, $this->getColumn()->getAttributeCode(), $image); + } + + protected function _getImageUrl($image) : string { + if (!$image) { + return ''; + } + return Mage::getBaseUrl('media') . 'catalog/product/' . $image; } - private function _checkImageIsSelected($row) + private function _checkImageIsSelected($row) : string|null { $value = $this->_getValue($row); if (!$value || $value == 'no_selection') return false; From 41fbdd39d2fb5289f6f14d9c750595dd1a67bff3 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:12:53 +0200 Subject: [PATCH 08/92] css parent --- .../Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php index 70abe31ef4a..6e7a29788f2 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php @@ -53,7 +53,7 @@ public function renderExport(Varien_Object $row) : string public function renderCss() { - return 'a-center'; + return parent::renderCss() . ' a-center'; } protected function _getHelperImage($image) : Mage_Catalog_Helper_Image From 480763b9fc5c13e2a64b63418263a30e83ef3fdc Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:35:02 +0200 Subject: [PATCH 09/92] doc --- .../Widget/Grid/Column/Renderer/Image.php | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php index 6e7a29788f2..7ac29788a40 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php @@ -1,4 +1,5 @@ _checkImageIsSelected($row); @@ -32,17 +39,22 @@ public function render(Varien_Object $row) //return ''; } $imageDimensions = $this->getColumn()->getWidth() ?: $this->_defaultWidth; - $imageSrc = $this->_getHelperImage($image) - ->resize($imageDimensions, $imageDimensions); + $imageSrc = $this->_getHelperImage($image)->resize($imageDimensions, $imageDimensions); $imageUrl = $this->_getImageUrl($image); $result = ''; $result .= ''; - $result .= '' . basename($imageUrl) . ''; + $result .= '' . basename($imageUrl) . ''; $result .= ''; return $result; } - public function renderExport(Varien_Object $row) : string + /** + * Render column for export + * + * @param Varien_Object $row + * @return string + */ + public function renderExport(Varien_Object $row): string { $image = $this->_checkImageIsSelected($row); if (!$image) { @@ -51,25 +63,41 @@ public function renderExport(Varien_Object $row) : string return $this->_getImageUrl($image); } + /** + * @return string|null + */ public function renderCss() { return parent::renderCss() . ' a-center'; } - protected function _getHelperImage($image) : Mage_Catalog_Helper_Image + /** + * @param string $image + * @return Mage_Catalog_Helper_Image + */ + protected function _getHelperImage($image): Mage_Catalog_Helper_Image { $dummyProduct = Mage::getModel('catalog/product'); return Mage::helper('catalog/image')->init($dummyProduct, $this->getColumn()->getAttributeCode(), $image); } - protected function _getImageUrl($image) : string { + /** + * @param string $image + * @return string + */ + protected function _getImageUrl($image): string + { if (!$image) { return ''; } return Mage::getBaseUrl('media') . 'catalog/product/' . $image; } - private function _checkImageIsSelected($row) : string|null + /** + * @param Varien_Object $row + * @return string|false + */ + private function _checkImageIsSelected($row): string|false { $value = $this->_getValue($row); if (!$value || $value == 'no_selection') return false; From 3d96895940c168b190a04df0a5eaaa7d2de00c5e Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:38:06 +0200 Subject: [PATCH 10/92] refactor --- .../Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php | 2 +- .../Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php | 2 +- .../Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php | 2 +- .../Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php | 2 +- app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php | 2 +- app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php | 4 ++-- .../Grid/Column/Renderer/{Image.php => Productimage.php} | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) rename app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/{Image.php => Productimage.php} (95%) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php index 97ef3b94d9a..431ff3c8112 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php @@ -124,7 +124,7 @@ protected function _prepareColumns() 'image', [ 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'image', + 'type' => 'productimage', 'index' => 'image', ] ); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php index b6ff8c8a492..14f1e74461c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php @@ -139,7 +139,7 @@ protected function _prepareColumns() 'image', [ 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'image', + 'type' => 'productimage', 'index' => 'image', ] ); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php index 63aebc73a20..7bda13cdc44 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php @@ -141,7 +141,7 @@ protected function _prepareColumns() 'image', [ 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'image', + 'type' => 'productimage', 'index' => 'image', ] ); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php index 45ccc625220..c6d2b236fb3 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php @@ -141,7 +141,7 @@ protected function _prepareColumns() 'image', [ 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'image', + 'type' => 'productimage', 'index' => 'image', ] ); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php index 600d83e5e17..b71bf28a46d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php @@ -159,7 +159,7 @@ protected function _prepareColumns() 'image', [ 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'image', + 'type' => 'productimage', 'index' => 'image', ] ); diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php index 0317540faaa..351b6bb43fb 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column.php @@ -288,8 +288,8 @@ protected function _getRendererByType() case 'theme': $rendererClass = 'adminhtml/widget_grid_column_renderer_theme'; break; - case 'image': - $rendererClass = 'adminhtml/widget_grid_column_renderer_image'; + case 'productimage': + $rendererClass = 'adminhtml/widget_grid_column_renderer_productimage'; break; default: $rendererClass = 'adminhtml/widget_grid_column_renderer_text'; diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php similarity index 95% rename from app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php rename to app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php index 7ac29788a40..8307309b2e5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Image.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php @@ -20,7 +20,7 @@ * @category Mage * @package Mage_Adminhtml */ -class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Image extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract +class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Productimage extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract { protected $_defaultWidth = 128; From b2c0b18cb0d357c1340387d2a8bd3450d465a59d Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:41:44 +0200 Subject: [PATCH 11/92] default width 64 --- .../Block/Widget/Grid/Column/Renderer/Productimage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php index 8307309b2e5..c42bb206993 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php @@ -23,7 +23,7 @@ class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Productimage extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract { - protected $_defaultWidth = 128; + protected $_defaultWidth = 64; /** * Renders grid column From 852bcbd43eca9e565b6fd47be46400c279fc0c4d Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 11:57:00 +0200 Subject: [PATCH 12/92] phpcs phpstan --- .../core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php | 1 + .../Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php | 2 +- .../Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php | 2 +- app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php | 2 +- .../Block/Widget/Grid/Column/Renderer/Productimage.php | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php index 431ff3c8112..f7c218121ac 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php @@ -83,6 +83,7 @@ protected function _prepareCollection() 'category_id=' . (int) $this->getRequest()->getParam('id', 0), 'left' ); + $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); $this->setCollection($collection); diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php index 7bda13cdc44..1dc632af010 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php @@ -97,7 +97,7 @@ protected function _prepareCollection() } $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); - + $this->setCollection($collection); return parent::_prepareCollection(); } diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php index c6d2b236fb3..17e03a1b127 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php @@ -136,7 +136,7 @@ protected function _prepareColumns() 'width' => 60, 'index' => 'entity_id' ]); - + $this->addColumn( 'image', [ diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php index b71bf28a46d..d8b93e11754 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php @@ -61,7 +61,7 @@ protected function _prepareCollection() 'left' ); } - + $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); if ($store->getId()) { diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php index c42bb206993..5e6fc301980 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php @@ -97,7 +97,7 @@ protected function _getImageUrl($image): string * @param Varien_Object $row * @return string|false */ - private function _checkImageIsSelected($row): string|false + private function _checkImageIsSelected($row) { $value = $this->_getValue($row); if (!$value || $value == 'no_selection') return false; From 43262da0a5a55f0463e48631c5aa2b3c90dbc2a7 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 12:54:52 +0200 Subject: [PATCH 13/92] phpcsfixer --- .../Block/Widget/Grid/Column/Renderer/Productimage.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php index 5e6fc301980..c4794980172 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php @@ -100,7 +100,9 @@ protected function _getImageUrl($image): string private function _checkImageIsSelected($row) { $value = $this->_getValue($row); - if (!$value || $value == 'no_selection') return false; + if (!$value || $value == 'no_selection') { + return false; + } return $value; } } From abd8a07a91a210e21a466fd3b96e00eef7d7ec9b Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 13:00:41 +0200 Subject: [PATCH 14/92] phpcs --- .../Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php index c4794980172..fad96f114ca 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php @@ -22,7 +22,6 @@ */ class Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Productimage extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract { - protected $_defaultWidth = 64; /** From be9d683327cdf446669b341dc0ebb21cd510c418 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 19 Aug 2023 16:08:20 +0200 Subject: [PATCH 15/92] add configuration --- .../Block/Catalog/Category/Tab/Product.php | 12 +-- .../Catalog/Product/Edit/Tab/Crosssell.php | 13 +-- .../Catalog/Product/Edit/Tab/Related.php | 13 +-- .../Block/Catalog/Product/Edit/Tab/Upsell.php | 13 +-- .../Adminhtml/Block/Catalog/Product/Grid.php | 13 +-- .../core/Mage/Adminhtml/Block/Widget/Grid.php | 24 ++++- .../Widget/Grid/Config/Product/Columns.php | 90 +++++++++++++++++++ .../Source/Catalog/Product/Gridcolumn.php | 32 +++++++ app/code/core/Mage/Core/etc/config.xml | 3 + app/code/core/Mage/Core/etc/system.xml | 33 ++++++- 10 files changed, 190 insertions(+), 56 deletions(-) create mode 100644 app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php create mode 100644 app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php index f7c218121ac..c4b42437fcf 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Category/Tab/Product.php @@ -23,6 +23,8 @@ */ class Mage_Adminhtml_Block_Catalog_Category_Tab_Product extends Mage_Adminhtml_Block_Widget_Grid { + use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; + /** * Mage_Adminhtml_Block_Catalog_Category_Tab_Product constructor. */ @@ -84,8 +86,6 @@ protected function _prepareCollection() 'left' ); - $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); - $this->setCollection($collection); if ($this->getCategory()->getProductsReadonly()) { @@ -121,14 +121,6 @@ protected function _prepareColumns() 'width' => '60', 'index' => 'entity_id' ]); - $this->addColumn( - 'image', - [ - 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'productimage', - 'index' => 'image', - ] - ); $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php index 14f1e74461c..51d164e23bf 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php @@ -23,6 +23,8 @@ */ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Crosssell extends Mage_Adminhtml_Block_Widget_Grid { + use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; + /** * Set grid params * @@ -95,8 +97,6 @@ protected function _prepareCollection() $collection->addFieldToFilter('entity_id', ['in' => $productIds]); } - $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); - $this->setCollection($collection); return parent::_prepareCollection(); @@ -135,15 +135,6 @@ protected function _prepareColumns() 'index' => 'entity_id' ]); - $this->addColumn( - 'image', - [ - 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'productimage', - 'index' => 'image', - ] - ); - $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php index 1dc632af010..2d3d85c7c7e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php @@ -23,6 +23,8 @@ */ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Related extends Mage_Adminhtml_Block_Widget_Grid { + use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; + /** * Set grid params * @@ -96,8 +98,6 @@ protected function _prepareCollection() $collection->addFieldToFilter('entity_id', ['in' => $productIds]); } - $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); - $this->setCollection($collection); return parent::_prepareCollection(); } @@ -137,15 +137,6 @@ protected function _prepareColumns() 'index' => 'entity_id' ]); - $this->addColumn( - 'image', - [ - 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'productimage', - 'index' => 'image', - ] - ); - $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php index 17e03a1b127..03a60f61006 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php @@ -23,6 +23,8 @@ */ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Upsell extends Mage_Adminhtml_Block_Widget_Grid { + use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; + /** * Set grid params * @@ -106,8 +108,6 @@ protected function _prepareCollection() $collection->addFieldToFilter('entity_id', ['in' => $productIds]); } - $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); - $this->setCollection($collection); return parent::_prepareCollection(); } @@ -137,15 +137,6 @@ protected function _prepareColumns() 'index' => 'entity_id' ]); - $this->addColumn( - 'image', - [ - 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'productimage', - 'index' => 'image', - ] - ); - $this->addColumn('name', [ 'header' => Mage::helper('catalog')->__('Name'), 'index' => 'name' diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php index d8b93e11754..e4576a63b3c 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php @@ -25,6 +25,8 @@ */ class Mage_Adminhtml_Block_Catalog_Product_Grid extends Mage_Adminhtml_Block_Widget_Grid { + use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; + public function __construct() { parent::__construct(); @@ -62,8 +64,6 @@ protected function _prepareCollection() ); } - $collection->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); - if ($store->getId()) { //$collection->setStoreId($store->getId()); $adminStore = Mage_Core_Model_App::ADMIN_STORE_ID; @@ -155,15 +155,6 @@ protected function _prepareColumns() ] ); - $this->addColumn( - 'image', - [ - 'header' => Mage::helper('catalog')->__('Image'), - 'type' => 'productimage', - 'index' => 'image', - ] - ); - $this->addColumn( 'name', [ diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index af36a237924..3288021c418 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -566,6 +566,7 @@ protected function _setCollectionOrder($column) protected function _prepareCollection() { if ($this->getCollection()) { + $this->_prepareCollectionFromConfig(); $this->_preparePage(); $columnId = $this->getParam($this->getVarNameSort(), $this->_defaultSort); @@ -622,16 +623,37 @@ protected function _preparePage() } /** - * Prepeare columns for grid + * Prepare columns for grid * * @return $this */ protected function _prepareColumns() { + $this->_prepareColumnsFromConfig(); $this->sortColumnsByOrder(); return $this; } + /** + * Prepare collection custom config + * + * @return $this + */ + protected function _prepareCollectionFromConfig() + { + return $this; + } + + /** + * Prepare columns custom config + * + * @return $this + */ + protected function _prepareColumnsFromConfig() + { + return $this; + } + /** * Prepare grid massaction block * diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php new file mode 100644 index 00000000000..e08ba52b247 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -0,0 +1,90 @@ +_configColumns)) { + if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMNS)) { + $this->_configColumns = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMNS)); + } + } + return $this->_configColumns; + } + + /** + * Prepare collection custom config + * + * @return $this + */ + protected function _prepareCollectionFromConfig() + { + if ($this->getCollection()) { + foreach ($this->getGridConfigColumns() as $value) { + switch ($value) { + case 'productimage': + $this->getCollection()->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); + break; + } + } + } + return $this; + } + + /** + * Prepare columns custom config + * + * @return $this + */ + protected function _prepareColumnsFromConfig() + { + foreach ($this->getGridConfigColumns() as $value) { + switch ($value) { + case 'productimage': + $this->addColumnAfter( + 'image', + [ + 'header' => Mage::helper('catalog')->__('Image'), + 'width' => Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH), + 'type' => 'productimage', + 'index' => 'image', + ], + 'entity_id' + ); + break; + } + } + return $this; + } +} diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php new file mode 100644 index 00000000000..6996c6ab7e8 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php @@ -0,0 +1,32 @@ + 'productimage', 'label' => Mage::helper('catalog')->__('Product Image')); + return $result; + } +} diff --git a/app/code/core/Mage/Core/etc/config.xml b/app/code/core/Mage/Core/etc/config.xml index ef593b10ba2..613a074291a 100644 --- a/app/code/core/Mage/Core/etc/config.xml +++ b/app/code/core/Mage/Core/etc/config.xml @@ -421,6 +421,9 @@ 200 + + 64 + dashboard diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index 9864433dedb..f204aa4352f 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1067,12 +1067,43 @@ + + + 6 + 1 + 0 + 0 + + + + multiselect + adminhtml/system_config_source_catalog_product_gridcolumn + 1 + 1 + 0 + 0 + 1 + + + + + validate-number validate-zero-or-greater + 2 + 1 + 0 + 0 + productimage + + + + + 1 0 0 - 6 + 7 From b1732aaacbad17ebd090ba72e36f6b5a93f4aa99 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 20 Aug 2023 12:45:28 +0200 Subject: [PATCH 16/92] support all columns configuration --- .../Widget/Grid/Config/Product/Columns.php | 92 ++++++++++++++++--- .../Source/Catalog/Product/Gridcolumn.php | 53 ++++++++++- app/code/core/Mage/Core/etc/system.xml | 6 +- 3 files changed, 131 insertions(+), 20 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index e08ba52b247..89079476b1d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -37,7 +37,10 @@ public function getGridConfigColumns() : array { if (empty($this->_configColumns)) { if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMNS)) { - $this->_configColumns = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMNS)); + $_attributeCodes = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMNS)); + foreach ($_attributeCodes as $attributeCode) { + $this->_configColumns[$attributeCode] = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); + } } } return $this->_configColumns; @@ -50,13 +53,9 @@ public function getGridConfigColumns() : array */ protected function _prepareCollectionFromConfig() { - if ($this->getCollection()) { - foreach ($this->getGridConfigColumns() as $value) { - switch ($value) { - case 'productimage': - $this->getCollection()->joinAttribute('image', 'catalog_product/image', 'entity_id', null, 'left'); - break; - } + if ($this->getCollection()) { + foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { + $this->getCollection()->addAttributeToSelect($attributeCode); } } return $this; @@ -69,21 +68,84 @@ protected function _prepareCollectionFromConfig() */ protected function _prepareColumnsFromConfig() { - foreach ($this->getGridConfigColumns() as $value) { - switch ($value) { - case 'productimage': + $_keepOrder = 'entity_id'; + /** @var Mage_Eav_Model_Attribute $_attributeEntity */ + foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { + switch ($_attributeEntity->getFrontendInput()) { + case 'media_image': $this->addColumnAfter( - 'image', + $attributeCode, [ - 'header' => Mage::helper('catalog')->__('Image'), + 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), 'width' => Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH), 'type' => 'productimage', - 'index' => 'image', + 'index' => $attributeCode, + 'attribute_code' => $attributeCode, + ], + $_keepOrder + ); + break; + case 'price': + $this->addColumnAfter( + $attributeCode, + [ + 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), + 'type' => 'price', + 'index' => $attributeCode, + 'attribute_code' => $attributeCode, + 'currency_code' => $this->_getStore()->getBaseCurrency()->getCode(), + ], + $_keepOrder + ); + break; + case 'date': + $this->addColumnAfter( + $attributeCode, + [ + 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), + 'type' => 'date', + 'index' => $attributeCode, + 'attribute_code' => $attributeCode, + ], + $_keepOrder + ); + break; + case 'multiselect': + case 'select': + + if ($_attributeEntity->usesSource()) { + $_allOptions = $_attributeEntity->getSource()->getAllOptions(false, true); + foreach ($_allOptions as $key => $option) { + $_options[$option['value']] = $option['label']; + } + } + $this->addColumnAfter( + $attributeCode, + [ + 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), + /* 'width' => '150px', */ + 'type' => 'options', + 'index' => $attributeCode, + 'options' => $_options, + 'attribute_code' => $attributeCode, + ], + $_keepOrder + ); + break; + default: + $this->addColumnAfter( + $attributeCode, + [ + 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), + 'type' => 'text', + 'index' => $attributeCode, + 'attribute_code' => $attributeCode, ], - 'entity_id' + $_keepOrder ); break; } + $_keepOrder = $attributeCode; } return $this; } diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php index 6996c6ab7e8..7c2915021a6 100644 --- a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php @@ -22,11 +22,56 @@ */ class Mage_Adminhtml_Model_System_Config_Source_Catalog_Product_GridColumn { + /** + * Attributes array + * + * @var null|array + */ + protected $_attributes = null; + + protected $_supportedColumnsType = [ + 'text', + 'textarea', + 'price', + 'date', + 'weight', + 'media_image', + 'select' + ]; + + protected $_excludeDefaultAttributesCode = [ + 'name', + 'price', + 'sku', + 'visibility', + 'status', + ]; + + /** + * Retrieve attributes as array + * + * @return array + */ public function toOptionArray() { - // TODO collect all columns for catalog product grids - $result = []; - $result[] = array('value' => 'productimage', 'label' => Mage::helper('catalog')->__('Product Image')); - return $result; + if (is_null($this->_attributes)) { + $attrCollection = Mage::getResourceModel('catalog/product_attribute_collection') + ->addVisibleFilter() + ->setFrontendInputTypeFilter($this->_supportedColumnsType) + ->addFieldToFilter('frontend_label', ['notnull' => true]) + ->setOrder('frontend_label', Varien_Data_Collection::SORT_ORDER_ASC); + + $this->_attributes = []; + /** @var Mage_Eav_Model_Attribute $attribute */ + foreach ($attrCollection as $attribute) { + if (!in_array($attribute->getAttributeCode(), $this->_excludeDefaultAttributesCode)) { + $this->_attributes[] = [ + 'label' => $attribute->getFrontendLabel(), + 'value' => $attribute->getAttributeCode(), + ]; + } + } + } + return $this->_attributes; } } diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index f204aa4352f..981c55e1082 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1092,7 +1092,11 @@ 1 0 0 - productimage + From 3a337e6d9c70aafef2d322974873921642ad1a64 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 20 Aug 2023 12:49:32 +0200 Subject: [PATCH 17/92] fix issues in catalog category --- .../Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 89079476b1d..fe433917859 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -69,6 +69,7 @@ protected function _prepareCollectionFromConfig() protected function _prepareColumnsFromConfig() { $_keepOrder = 'entity_id'; + $storeId = (int) $this->getRequest()->getParam('store', 0); /** @var Mage_Eav_Model_Attribute $_attributeEntity */ foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { switch ($_attributeEntity->getFrontendInput()) { @@ -86,6 +87,7 @@ protected function _prepareColumnsFromConfig() ); break; case 'price': + $_currency = Mage::app()->getStore($storeId)->getBaseCurrency()->getCode(); $this->addColumnAfter( $attributeCode, [ @@ -93,7 +95,7 @@ protected function _prepareColumnsFromConfig() 'type' => 'price', 'index' => $attributeCode, 'attribute_code' => $attributeCode, - 'currency_code' => $this->_getStore()->getBaseCurrency()->getCode(), + 'currency_code' => $_currency, ], $_keepOrder ); From ab02a338e299158e81de9fc9e8dadc8ac741c752 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 20 Aug 2023 13:19:09 +0200 Subject: [PATCH 18/92] add configuration enable grids --- .../Widget/Grid/Config/Product/Columns.php | 35 +++++++++++++++++++ .../Catalog/Product/Column.php} | 2 +- .../Grid/Catalog/Product/GridIdList.php | 35 +++++++++++++++++++ app/code/core/Mage/Core/etc/system.xml | 16 +++++++-- 4 files changed, 84 insertions(+), 4 deletions(-) rename app/code/core/Mage/Adminhtml/Model/System/Config/Source/{Catalog/Product/Gridcolumn.php => Grid/Catalog/Product/Column.php} (96%) create mode 100644 app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/GridIdList.php diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index fe433917859..f56c066ce2e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -23,10 +23,37 @@ */ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns { + public const CONFIG_PATH_GRID_ENBALED = 'admin/grid_catalog/enabled'; public const CONFIG_PATH_GRID_COLUMNS = 'admin/grid_catalog/columns'; public const CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH = 'admin/grid_catalog/imagewith'; protected $_configColumns = []; + protected $_enabledGrids = []; + + /** + * Get grid enabled for custom columns + * + * @return array + */ + public function getGridEnabled(): array + { + if (empty($this->_enabledGrids)) { + if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENBALED)) { + $this->_enabledGrids = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENBALED)); + } + } + return $this->_enabledGrids; + } + + /** + * Get grid enabled for custom columns + * + * @return array + */ + public function isGridEnabled(): bool + { + return in_array($this->getId(), $this->getGridEnabled()); + } /** * Get list of columns that should be showed @@ -53,6 +80,10 @@ public function getGridConfigColumns() : array */ protected function _prepareCollectionFromConfig() { + if (!$this->isGridEnabled()) { + return false; + } + if ($this->getCollection()) { foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { $this->getCollection()->addAttributeToSelect($attributeCode); @@ -68,6 +99,10 @@ protected function _prepareCollectionFromConfig() */ protected function _prepareColumnsFromConfig() { + if (!$this->isGridEnabled()) { + return false; + } + $_keepOrder = 'entity_id'; $storeId = (int) $this->getRequest()->getParam('store', 0); /** @var Mage_Eav_Model_Attribute $_attributeEntity */ diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/Column.php similarity index 96% rename from app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php rename to app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/Column.php index 7c2915021a6..144a18cb044 100644 --- a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Catalog/Product/Gridcolumn.php +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/Column.php @@ -20,7 +20,7 @@ * @category Mage * @package Mage_Adminhtml */ -class Mage_Adminhtml_Model_System_Config_Source_Catalog_Product_GridColumn +class Mage_Adminhtml_Model_System_Config_Source_Grid_Catalog_Product_Column { /** * Attributes array diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/GridIdList.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/GridIdList.php new file mode 100644 index 00000000000..403631b9cf6 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/GridIdList.php @@ -0,0 +1,35 @@ + 'productGrid', 'label' => Mage::helper('adminhtml')->__('Catalog Product')], + ['value' => 'catalog_category_products', 'label' => Mage::helper('adminhtml')->__('Catalog Category Product')], + ['value' => 'related_product_grid', 'label' => Mage::helper('adminhtml')->__('Catalog Product Related')], + ['value' => 'up_sell_product_grid', 'label' => Mage::helper('adminhtml')->__('Catalog Product Up-Sells')], + ['value' => 'cross_sell_product_grid', 'label' => Mage::helper('adminhtml')->__('Catalog Product Cross-Sells')], + ]; + } +} diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index 981c55e1082..d6d8bb29c74 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1074,11 +1074,21 @@ 0 0 + + + multiselect + adminhtml/system_config_source_grid_catalog_product_gridIdList + 1 + 1 + 0 + 0 + 1 + multiselect - adminhtml/system_config_source_catalog_product_gridcolumn - 1 + adminhtml/system_config_source_grid_catalog_product_column + 2 1 0 0 @@ -1088,7 +1098,7 @@ validate-number validate-zero-or-greater - 2 + 3 1 0 0 From e421c71d67662723666cd18fd4c57b0277c1a1da Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 20 Aug 2023 13:40:23 +0200 Subject: [PATCH 19/92] fix select option filters --- .../Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index f56c066ce2e..6b2fade7282 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -151,6 +151,7 @@ protected function _prepareColumnsFromConfig() case 'select': if ($_attributeEntity->usesSource()) { + $_options = []; $_allOptions = $_attributeEntity->getSource()->getAllOptions(false, true); foreach ($_allOptions as $key => $option) { $_options[$option['value']] = $option['label']; From fba16e6340293d839d1558073bf26bd175af8ddf Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 20 Aug 2023 13:50:58 +0200 Subject: [PATCH 20/92] mistype --- .../Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 6b2fade7282..e6679a6d2dc 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -23,7 +23,7 @@ */ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns { - public const CONFIG_PATH_GRID_ENBALED = 'admin/grid_catalog/enabled'; + public const CONFIG_PATH_GRID_ENABLED = 'admin/grid_catalog/enabled'; public const CONFIG_PATH_GRID_COLUMNS = 'admin/grid_catalog/columns'; public const CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH = 'admin/grid_catalog/imagewith'; @@ -38,8 +38,8 @@ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns public function getGridEnabled(): array { if (empty($this->_enabledGrids)) { - if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENBALED)) { - $this->_enabledGrids = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENBALED)); + if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENABLED)) { + $this->_enabledGrids = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENABLED)); } } return $this->_enabledGrids; From 97b84f4e026dafde7017bec0adaa2c76db0c2470 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 20 Aug 2023 14:02:36 +0200 Subject: [PATCH 21/92] indentation --- .../core/Mage/Adminhtml/Block/Catalog/Product/Grid.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php index e4576a63b3c..41c2efe80e4 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php @@ -48,10 +48,10 @@ protected function _prepareCollection() { $store = $this->_getStore(); $collection = Mage::getModel('catalog/product')->getCollection() - ->addAttributeToSelect('sku') - ->addAttributeToSelect('name') - ->addAttributeToSelect('attribute_set_id') - ->addAttributeToSelect('type_id'); + ->addAttributeToSelect('sku') + ->addAttributeToSelect('name') + ->addAttributeToSelect('attribute_set_id') + ->addAttributeToSelect('type_id'); if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) { $collection->joinField( From fa624dc53d2cd0f5e761b62154b5051653e2b0e8 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 21 Aug 2023 10:12:05 +0200 Subject: [PATCH 22/92] support create_at updated_at column --- .../Widget/Grid/Config/Product/Columns.php | 40 ++++++++++++++++++- app/code/core/Mage/Core/etc/system.xml | 24 ++++++++++- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index e6679a6d2dc..2de2976e821 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -25,6 +25,8 @@ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns { public const CONFIG_PATH_GRID_ENABLED = 'admin/grid_catalog/enabled'; public const CONFIG_PATH_GRID_COLUMNS = 'admin/grid_catalog/columns'; + public const CONFIG_PATH_GRID_CREATED_AT = 'admin/grid_catalog/created_at'; + public const CONFIG_PATH_GRID_UPDATED_AT = 'admin/grid_catalog/updated_at'; public const CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH = 'admin/grid_catalog/imagewith'; protected $_configColumns = []; @@ -83,11 +85,17 @@ protected function _prepareCollectionFromConfig() if (!$this->isGridEnabled()) { return false; } - + /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ if ($this->getCollection()) { foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { $this->getCollection()->addAttributeToSelect($attributeCode); } + if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_CREATED_AT)) { + $this->getCollection()->addAttributeToSelect('created_at'); + } + if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_UPDATED_AT)) { + $this->getCollection()->addAttributeToSelect('updated_at'); + } } return $this; } @@ -103,8 +111,36 @@ protected function _prepareColumnsFromConfig() return false; } - $_keepOrder = 'entity_id'; $storeId = (int) $this->getRequest()->getParam('store', 0); + $_keepOrder = 'entity_id'; + + if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_CREATED_AT)) { + $this->addColumnAfter( + 'created_at', + [ + 'header' => Mage::helper('catalog')->__('Created At'), + 'type' => 'datetime', + 'index' => 'created_at', + 'attribute_code' => 'created_at', + ], + $_keepOrder + ); + $_keepOrder = 'created_at'; + } + if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_UPDATED_AT)) { + $this->addColumnAfter( + 'updated_at', + [ + 'header' => Mage::helper('catalog')->__('Updated At'), + 'type' => 'datetime', + 'index' => 'updated_at', + 'attribute_code' => 'updated_at', + ], + $_keepOrder + ); + $_keepOrder = 'updated_at'; + } + /** @var Mage_Eav_Model_Attribute $_attributeEntity */ foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { switch ($_attributeEntity->getFrontendInput()) { diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index d6d8bb29c74..b5f3fe51251 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1084,11 +1084,31 @@ 0 1 + + + select + adminhtml/system_config_source_yesno + 2 + 1 + 0 + 0 + 1 + + + + select + adminhtml/system_config_source_yesno + 3 + 1 + 0 + 0 + 1 + multiselect adminhtml/system_config_source_grid_catalog_product_column - 2 + 4 1 0 0 @@ -1098,7 +1118,7 @@ validate-number validate-zero-or-greater - 3 + 5 1 0 0 From deaf110108697760e058d97eeae3333e4d6e1619 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 21 Aug 2023 11:14:05 +0200 Subject: [PATCH 23/92] add horizontal scroll to top --- .../adminhtml/default/default/layout/main.xml | 1 + js/mage/adminhtml/grid-double-scroll.js | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 js/mage/adminhtml/grid-double-scroll.js diff --git a/app/design/adminhtml/default/default/layout/main.xml b/app/design/adminhtml/default/default/layout/main.xml index 3bcb43463c5..4091aa81f52 100644 --- a/app/design/adminhtml/default/default/layout/main.xml +++ b/app/design/adminhtml/default/default/layout/main.xml @@ -60,6 +60,7 @@ Default layout, loads most of the pages + diff --git a/js/mage/adminhtml/grid-double-scroll.js b/js/mage/adminhtml/grid-double-scroll.js new file mode 100644 index 00000000000..0d212711c44 --- /dev/null +++ b/js/mage/adminhtml/grid-double-scroll.js @@ -0,0 +1,53 @@ +window.addEventListener('DOMContentLoaded', function() { + function DoubleScroll(element) { + if(!element.getAttribute('data-doublescroll')){ + var scrollbar= document.createElement('div'); + scrollbar.appendChild(document.createElement('div')); + scrollbar.style.overflow= 'auto'; + scrollbar.style.overflowY= 'hidden'; + scrollbar.firstChild.style.width= element.scrollWidth+'px'; + scrollbar.firstChild.style.height= '0'; + scrollbar.firstChild.style.paddingTop= '1px'; + scrollbar.firstChild.appendChild(document.createTextNode('\xA0')); + var running = false; + scrollbar.onscroll= function() { + if(running) { + running = false; + return; + } + running = true; + element.scrollLeft= scrollbar.scrollLeft; + }; + element.onscroll= function() { + if(running) { + running = false; + return; + } + running = true; + scrollbar.scrollLeft= element.scrollLeft; + }; + element.parentNode.insertBefore(scrollbar, element); + element.setAttribute('data-doublescroll', 1); + } + } + var horscrolls = document.querySelectorAll('.hor-scroll'); + for (horscroll of horscrolls) { + DoubleScroll(horscroll); + } + const config = { childList: true }; + const callback = function(mutationsList, observer) { + var horscrolls = document.querySelectorAll('.hor-scroll'); + for (horscroll of horscrolls) { + DoubleScroll(horscroll); + } + }; + const observer = new MutationObserver(callback); + const productGridNode = document.getElementById('productGrid'); + if(productGridNode){ + observer.observe(productGridNode, config); + } + const salesOrderGridNode = document.getElementById('sales_order_grid'); + if(salesOrderGridNode){ + observer.observe(salesOrderGridNode, config); + } +}); From fd7210658d6b4ee861dfe194e4f56a3b23c71b26 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 11:47:04 +0200 Subject: [PATCH 24/92] configuration foreach grid area --- .../Widget/Grid/Config/Product/Columns.php | 71 +-- .../Adminhtml/Helper/Widget/Grid/Config.php | 95 ++++ .../core/Mage/Adminhtml/etc/adminhtml.xml | 4 + app/code/core/Mage/Core/etc/config.xml | 25 +- app/code/core/Mage/Core/etc/system.xml | 446 +++++++++++++++--- 5 files changed, 526 insertions(+), 115 deletions(-) create mode 100644 app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 2de2976e821..aa51a938050 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -23,38 +23,18 @@ */ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns { - public const CONFIG_PATH_GRID_ENABLED = 'admin/grid_catalog/enabled'; - public const CONFIG_PATH_GRID_COLUMNS = 'admin/grid_catalog/columns'; - public const CONFIG_PATH_GRID_CREATED_AT = 'admin/grid_catalog/created_at'; - public const CONFIG_PATH_GRID_UPDATED_AT = 'admin/grid_catalog/updated_at'; - public const CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH = 'admin/grid_catalog/imagewith'; - protected $_configColumns = []; - protected $_enabledGrids = []; - /** - * Get grid enabled for custom columns - * - * @return array - */ - public function getGridEnabled(): array - { - if (empty($this->_enabledGrids)) { - if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENABLED)) { - $this->_enabledGrids = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_ENABLED)); - } - } - return $this->_enabledGrids; - } + /* @var Mage_Adminhtml_Helper_Widget_Grid_Config $_helper */ + private $_helperConfig = NULL; - /** - * Get grid enabled for custom columns - * - * @return array - */ - public function isGridEnabled(): bool + protected function getHelperConfig(): Mage_Adminhtml_Helper_Widget_Grid_Config { - return in_array($this->getId(), $this->getGridEnabled()); + if (!$this->_helperConfig) { + $this->_helperConfig = Mage::helper('adminhtml/widget_grid_config'); + } + $this->_helperConfig->setGridId($this->getId()); + return $this->_helperConfig; } /** @@ -62,17 +42,12 @@ public function isGridEnabled(): bool * * @return array */ - public function getGridConfigColumns() : array + public function getEntityColumns() : array|null { - if (empty($this->_configColumns)) { - if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMNS)) { - $_attributeCodes = explode(',', Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMNS)); - foreach ($_attributeCodes as $attributeCode) { - $this->_configColumns[$attributeCode] = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); - } - } + foreach ($this->getHelperConfig()->getColumns() as $attributeCode) { + $this->_configColumns[$this->getId()][$attributeCode] = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); } - return $this->_configColumns; + return $this->_configColumns[$this->getId()]; } /** @@ -82,18 +57,20 @@ public function getGridConfigColumns() : array */ protected function _prepareCollectionFromConfig() { - if (!$this->isGridEnabled()) { + if (!$this->getHelperConfig()->isGridEnabled()) { return false; } /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ if ($this->getCollection()) { - foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { + foreach ($this->getEntityColumns() as $attributeCode => $_attributeEntity) { $this->getCollection()->addAttributeToSelect($attributeCode); } - if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_CREATED_AT)) { + + if ($this->getHelperConfig()->isCreatedAtEnabled()) { $this->getCollection()->addAttributeToSelect('created_at'); } - if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_UPDATED_AT)) { + + if ($this->getHelperConfig()->isUpdatedAtEnabled()) { $this->getCollection()->addAttributeToSelect('updated_at'); } } @@ -107,14 +84,14 @@ protected function _prepareCollectionFromConfig() */ protected function _prepareColumnsFromConfig() { - if (!$this->isGridEnabled()) { + if (!$this->getHelperConfig()->isGridEnabled()) { return false; } $storeId = (int) $this->getRequest()->getParam('store', 0); $_keepOrder = 'entity_id'; - if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_CREATED_AT)) { + if ($this->getHelperConfig()->isCreatedAtEnabled()) { $this->addColumnAfter( 'created_at', [ @@ -127,7 +104,8 @@ protected function _prepareColumnsFromConfig() ); $_keepOrder = 'created_at'; } - if (Mage::getStoreConfig(self::CONFIG_PATH_GRID_UPDATED_AT)) { + + if ($this->getHelperConfig()->isUpdatedAtEnabled()) { $this->addColumnAfter( 'updated_at', [ @@ -142,14 +120,14 @@ protected function _prepareColumnsFromConfig() } /** @var Mage_Eav_Model_Attribute $_attributeEntity */ - foreach ($this->getGridConfigColumns() as $attributeCode => $_attributeEntity) { + foreach ($this->getEntityColumns() as $attributeCode => $_attributeEntity) { switch ($_attributeEntity->getFrontendInput()) { case 'media_image': $this->addColumnAfter( $attributeCode, [ 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), - 'width' => Mage::getStoreConfig(self::CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH), + 'width' => $this->getHelperConfig()->getProductImageWidth(), 'type' => 'productimage', 'index' => $attributeCode, 'attribute_code' => $attributeCode, @@ -185,7 +163,6 @@ protected function _prepareColumnsFromConfig() break; case 'multiselect': case 'select': - if ($_attributeEntity->usesSource()) { $_options = []; $_allOptions = $_attributeEntity->getSource()->getAllOptions(false, true); diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php new file mode 100644 index 00000000000..784caede4d7 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -0,0 +1,95 @@ +_gridId = $id; + return $this; + } + + public function getGridId(): string|null + { + return $this->_gridId; + } + + /** + * Get store config for grid id + * + * @return mixed + * @throws Mage_Core_Exception + */ + public function getStoreConfigGridId($configPath) + { if(!$this->_gridId) { + Mage::throwException(Mage::helper('adminhtml')->__('Grid Id must be set.')); + } + $config = sprintf($configPath, $this->_gridId); + return Mage::getStoreConfig($config); + } + + /** + * Get grid enabled for custom columns + * + * @return array + */ + public function isGridEnabled(): bool + { + return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_ENABLED); + } + + public function isCreatedAtEnabled() + { + return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_CREATED_AT); + } + + public function isUpdatedAtEnabled() + { + return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_UPDATED_AT); + } + + /** + * Get grid enabled for custom columns + * + * @return array + */ + public function getColumns(): array + { + if ($this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMNS)) { + return explode(',', $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMNS)); + } + } + + public function getProductImageWidth(): string + { + return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH); + } + +} diff --git a/app/code/core/Mage/Adminhtml/etc/adminhtml.xml b/app/code/core/Mage/Adminhtml/etc/adminhtml.xml index a48db6818a6..69c861c3e62 100644 --- a/app/code/core/Mage/Adminhtml/etc/adminhtml.xml +++ b/app/code/core/Mage/Adminhtml/etc/adminhtml.xml @@ -198,6 +198,10 @@ Admin 100 + + Advanced Grid Configuration + 101 + diff --git a/app/code/core/Mage/Core/etc/config.xml b/app/code/core/Mage/Core/etc/config.xml index 613a074291a..41927f247b7 100644 --- a/app/code/core/Mage/Core/etc/config.xml +++ b/app/code/core/Mage/Core/etc/config.xml @@ -421,9 +421,6 @@ 200 - - 64 - dashboard @@ -440,6 +437,28 @@ 0 + + + 0 + 64 + + + 0 + 64 + + + 0 + 64 + + + 0 + 64 + + + 0 + 64 + + AT,BE,BG,CY,CZ,DK,EE,FI,FR,DE,GR,HU,IE,IT,LV,LT,LU,MT,NL,PL,PT,RO,SK,SI,ES,SE,HR diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index b5f3fe51251..b459565bfc1 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1067,71 +1067,6 @@ - - - 6 - 1 - 0 - 0 - - - - multiselect - adminhtml/system_config_source_grid_catalog_product_gridIdList - 1 - 1 - 0 - 0 - 1 - - - - select - adminhtml/system_config_source_yesno - 2 - 1 - 0 - 0 - 1 - - - - select - adminhtml/system_config_source_yesno - 3 - 1 - 0 - 0 - 1 - - - - multiselect - adminhtml/system_config_source_grid_catalog_product_column - 4 - 1 - 0 - 0 - 1 - - - - - validate-number validate-zero-or-greater - 5 - 1 - 0 - 0 - - - - - - 1 @@ -1744,5 +1679,386 @@ + + + + advanced + 21 + 1 + 0 + 0 + + + + 6 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 1 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 2 + 1 + 0 + 0 + 1 + + 1 + + + + + select + adminhtml/system_config_source_yesno + 3 + 1 + 0 + 0 + 1 + + 1 + + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_column + 4 + 1 + 0 + 0 + 1 + + 1 + + + + + + validate-number validate-zero-or-greater + 5 + 1 + 0 + 0 + + + 1 + + + + + + + 6 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 1 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 2 + 1 + 0 + 0 + 1 + + 1 + + + + + select + adminhtml/system_config_source_yesno + 3 + 1 + 0 + 0 + 1 + + 1 + + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_column + 4 + 1 + 0 + 0 + 1 + + 1 + + + + + + validate-number validate-zero-or-greater + 5 + 1 + 0 + 0 + + + 1 + + + + + + + 6 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 1 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 2 + 1 + 0 + 0 + 1 + + 1 + + + + + select + adminhtml/system_config_source_yesno + 3 + 1 + 0 + 0 + 1 + + 1 + + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_column + 4 + 1 + 0 + 0 + 1 + + 1 + + + + + + validate-number validate-zero-or-greater + 5 + 1 + 0 + 0 + + + 1 + + + + + + + 6 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 1 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 2 + 1 + 0 + 0 + 1 + + 1 + + + + + select + adminhtml/system_config_source_yesno + 3 + 1 + 0 + 0 + 1 + + 1 + + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_column + 4 + 1 + 0 + 0 + 1 + + 1 + + + + + + validate-number validate-zero-or-greater + 5 + 1 + 0 + 0 + + + 1 + + + + + + + 6 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 1 + 1 + 0 + 0 + + + + select + adminhtml/system_config_source_yesno + 2 + 1 + 0 + 0 + 1 + + 1 + + + + + select + adminhtml/system_config_source_yesno + 3 + 1 + 0 + 0 + 1 + + 1 + + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_column + 4 + 1 + 0 + 0 + 1 + + 1 + + + + + + validate-number validate-zero-or-greater + 5 + 1 + 0 + 0 + + + 1 + + + + + + From 6d98ed11443a50657fe8877a7f77c9d74595cc9b Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 12:00:39 +0200 Subject: [PATCH 25/92] phpstan --- .../Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index aa51a938050..b95bf6f584d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -58,7 +58,7 @@ public function getEntityColumns() : array|null protected function _prepareCollectionFromConfig() { if (!$this->getHelperConfig()->isGridEnabled()) { - return false; + return $this; } /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ if ($this->getCollection()) { @@ -85,7 +85,7 @@ protected function _prepareCollectionFromConfig() protected function _prepareColumnsFromConfig() { if (!$this->getHelperConfig()->isGridEnabled()) { - return false; + return $this; } $storeId = (int) $this->getRequest()->getParam('store', 0); From 00456a58f8c67429d3a33d498b7fc4a38da277a1 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 12:13:55 +0200 Subject: [PATCH 26/92] refactor simplify trait --- .../Catalog/Product/Edit/Tab/Crosssell.php | 2 +- .../Catalog/Product/Edit/Tab/Related.php | 2 +- .../Block/Catalog/Product/Edit/Tab/Upsell.php | 2 +- .../Widget/Grid/Config/Product/Columns.php | 48 +++++++------------ .../Adminhtml/Helper/Widget/Grid/Config.php | 16 +++++-- 5 files changed, 33 insertions(+), 37 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php index 51d164e23bf..3bafa34d840 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Crosssell.php @@ -24,7 +24,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Crosssell extends Mage_Adminhtml_Block_Widget_Grid { use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; - + /** * Set grid params * diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php index 2d3d85c7c7e..30cbaf3410e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Related.php @@ -24,7 +24,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Related extends Mage_Adminhtml_Block_Widget_Grid { use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; - + /** * Set grid params * diff --git a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php index 03a60f61006..528b1c03e6e 100644 --- a/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php +++ b/app/code/core/Mage/Adminhtml/Block/Catalog/Product/Edit/Tab/Upsell.php @@ -24,7 +24,7 @@ class Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Upsell extends Mage_Adminhtml_Block_Widget_Grid { use Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns; - + /** * Set grid params * diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index b95bf6f584d..465d2a29b3d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -23,31 +23,16 @@ */ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns { - protected $_configColumns = []; - /* @var Mage_Adminhtml_Helper_Widget_Grid_Config $_helper */ - private $_helperConfig = NULL; - - protected function getHelperConfig(): Mage_Adminhtml_Helper_Widget_Grid_Config - { - if (!$this->_helperConfig) { - $this->_helperConfig = Mage::helper('adminhtml/widget_grid_config'); - } - $this->_helperConfig->setGridId($this->getId()); - return $this->_helperConfig; - } + private $_helperAdvancedGrid = NULL; - /** - * Get list of columns that should be showed - * - * @return array - */ - public function getEntityColumns() : array|null + protected function getHelperAdvancedGrid(): Mage_Adminhtml_Helper_Widget_Grid_Config { - foreach ($this->getHelperConfig()->getColumns() as $attributeCode) { - $this->_configColumns[$this->getId()][$attributeCode] = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); + if (!$this->_helperAdvancedGrid) { + $this->_helperAdvancedGrid = Mage::helper('adminhtml/widget_grid_config'); } - return $this->_configColumns[$this->getId()]; + $this->_helperAdvancedGrid->setGridId($this->getId()); + return $this->_helperAdvancedGrid; } /** @@ -57,20 +42,20 @@ public function getEntityColumns() : array|null */ protected function _prepareCollectionFromConfig() { - if (!$this->getHelperConfig()->isGridEnabled()) { + if (!$this->getHelperAdvancedGrid()->isGridEnabled()) { return $this; } /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ if ($this->getCollection()) { - foreach ($this->getEntityColumns() as $attributeCode => $_attributeEntity) { + foreach ($this->getHelperAdvancedGrid()->getColumns() as $attributeCode) { $this->getCollection()->addAttributeToSelect($attributeCode); } - if ($this->getHelperConfig()->isCreatedAtEnabled()) { + if ($this->getHelperAdvancedGrid()->isCreatedAtEnabled()) { $this->getCollection()->addAttributeToSelect('created_at'); } - if ($this->getHelperConfig()->isUpdatedAtEnabled()) { + if ($this->getHelperAdvancedGrid()->isUpdatedAtEnabled()) { $this->getCollection()->addAttributeToSelect('updated_at'); } } @@ -84,14 +69,14 @@ protected function _prepareCollectionFromConfig() */ protected function _prepareColumnsFromConfig() { - if (!$this->getHelperConfig()->isGridEnabled()) { + if (!$this->getHelperAdvancedGrid()->isGridEnabled()) { return $this; } $storeId = (int) $this->getRequest()->getParam('store', 0); $_keepOrder = 'entity_id'; - if ($this->getHelperConfig()->isCreatedAtEnabled()) { + if ($this->getHelperAdvancedGrid()->isCreatedAtEnabled()) { $this->addColumnAfter( 'created_at', [ @@ -105,7 +90,7 @@ protected function _prepareColumnsFromConfig() $_keepOrder = 'created_at'; } - if ($this->getHelperConfig()->isUpdatedAtEnabled()) { + if ($this->getHelperAdvancedGrid()->isUpdatedAtEnabled()) { $this->addColumnAfter( 'updated_at', [ @@ -119,15 +104,16 @@ protected function _prepareColumnsFromConfig() $_keepOrder = 'updated_at'; } - /** @var Mage_Eav_Model_Attribute $_attributeEntity */ - foreach ($this->getEntityColumns() as $attributeCode => $_attributeEntity) { + foreach ($this->getHelperAdvancedGrid()->getColumns() as $attributeCode) { + /** @var Mage_Eav_Model_Attribute $_attributeEntity */ + $_attributeEntity = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); switch ($_attributeEntity->getFrontendInput()) { case 'media_image': $this->addColumnAfter( $attributeCode, [ 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), - 'width' => $this->getHelperConfig()->getProductImageWidth(), + 'width' => $this->getHelperAdvancedGrid()->getProductImageWidth(), 'type' => 'productimage', 'index' => $attributeCode, 'attribute_code' => $attributeCode, diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php index 784caede4d7..06009451f70 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -28,15 +28,25 @@ class Mage_Adminhtml_Helper_Widget_Grid_Config extends Mage_Core_Helper_Abstract public const CONFIG_PATH_GRID_UPDATED_AT = 'advanced_grid/%s/updated_at'; public const CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH = 'advanced_grid/%s/imagewith'; - protected $_gridId = NULL; + protected $_gridId = ''; - public function setGridId($id): self + /** + * Set grid id configuration scope + * + * @return $this + */ + public function setGridId($id) { $this->_gridId = $id; return $this; } - public function getGridId(): string|null + /** + * Get grid id configuration scope + * + * @return string|null + */ + public function getGridId(): string { return $this->_gridId; } From 2156ffc3682774f9ae16788be5ff579fb9d916b1 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 13:04:28 +0200 Subject: [PATCH 27/92] improve configuration --- .../Widget/Grid/Config/Product/Columns.php | 38 +-- .../Adminhtml/Helper/Widget/Grid/Config.php | 47 +++- .../Source/Grid/Catalog/Product/Column.php | 1 - .../Grid/Catalog/Product/MediaImage.php | 61 +++++ app/code/core/Mage/Core/etc/config.xml | 10 +- app/code/core/Mage/Core/etc/system.xml | 222 ++++++++++++------ 6 files changed, 275 insertions(+), 104 deletions(-) create mode 100644 app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/MediaImage.php diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 465d2a29b3d..e822061c1ae 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -42,7 +42,7 @@ protected function getHelperAdvancedGrid(): Mage_Adminhtml_Helper_Widget_Grid_Co */ protected function _prepareCollectionFromConfig() { - if (!$this->getHelperAdvancedGrid()->isGridEnabled()) { + if (!$this->getHelperAdvancedGrid()->isEnabled()) { return $this; } /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ @@ -51,6 +51,10 @@ protected function _prepareCollectionFromConfig() $this->getCollection()->addAttributeToSelect($attributeCode); } + foreach ($this->getHelperAdvancedGrid()->getImageColumns() as $attributeCode) { + $this->getCollection()->addAttributeToSelect($attributeCode); + } + if ($this->getHelperAdvancedGrid()->isCreatedAtEnabled()) { $this->getCollection()->addAttributeToSelect('created_at'); } @@ -69,13 +73,30 @@ protected function _prepareCollectionFromConfig() */ protected function _prepareColumnsFromConfig() { - if (!$this->getHelperAdvancedGrid()->isGridEnabled()) { + if (!$this->getHelperAdvancedGrid()->isEnabled()) { return $this; } $storeId = (int) $this->getRequest()->getParam('store', 0); $_keepOrder = 'entity_id'; + foreach ($this->getHelperAdvancedGrid()->getImageColumns() as $attributeCode) { + /** @var Mage_Eav_Model_Attribute $_attributeEntity */ + $_attributeEntity = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); + $this->addColumnAfter( + $attributeCode, + [ + 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), + 'width' => $this->getHelperAdvancedGrid()->getProductImageWidth(), + 'type' => 'productimage', + 'index' => $attributeCode, + 'attribute_code' => $attributeCode, + ], + $_keepOrder + ); + $_keepOrder = $attributeCode; + } + if ($this->getHelperAdvancedGrid()->isCreatedAtEnabled()) { $this->addColumnAfter( 'created_at', @@ -108,19 +129,6 @@ protected function _prepareColumnsFromConfig() /** @var Mage_Eav_Model_Attribute $_attributeEntity */ $_attributeEntity = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); switch ($_attributeEntity->getFrontendInput()) { - case 'media_image': - $this->addColumnAfter( - $attributeCode, - [ - 'header' => Mage::helper('catalog')->__($_attributeEntity->getFrontendLabel()), - 'width' => $this->getHelperAdvancedGrid()->getProductImageWidth(), - 'type' => 'productimage', - 'index' => $attributeCode, - 'attribute_code' => $attributeCode, - ], - $_keepOrder - ); - break; case 'price': $_currency = Mage::app()->getStore($storeId)->getBaseCurrency()->getCode(); $this->addColumnAfter( diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php index 06009451f70..f39fa62c219 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -26,8 +26,13 @@ class Mage_Adminhtml_Helper_Widget_Grid_Config extends Mage_Core_Helper_Abstract public const CONFIG_PATH_GRID_COLUMNS = 'advanced_grid/%s/columns'; public const CONFIG_PATH_GRID_CREATED_AT = 'advanced_grid/%s/created_at'; public const CONFIG_PATH_GRID_UPDATED_AT = 'advanced_grid/%s/updated_at'; - public const CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH = 'advanced_grid/%s/imagewith'; + public const CONFIG_PATH_GRID_COLUMN_IMAGE = 'advanced_grid/%s/media_image'; + public const CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH = 'advanced_grid/%s/media_image_width'; + /** + * Scope grid id for configurations + * + */ protected $_gridId = ''; /** @@ -44,7 +49,7 @@ public function setGridId($id) /** * Get grid id configuration scope * - * @return string|null + * @return string */ public function getGridId(): string { @@ -68,18 +73,28 @@ public function getStoreConfigGridId($configPath) /** * Get grid enabled for custom columns * - * @return array + * @return bool */ - public function isGridEnabled(): bool + public function isEnabled(): bool { return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_ENABLED); } + /** + * Get column created_at is enabled + * + * @return bool + */ public function isCreatedAtEnabled() { return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_CREATED_AT); } + /** + * Get column updated_at is enabled + * + * @return bool + */ public function isUpdatedAtEnabled() { return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_UPDATED_AT); @@ -92,14 +107,32 @@ public function isUpdatedAtEnabled() */ public function getColumns(): array { - if ($this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMNS)) { - return explode(',', $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMNS)); + if (!$this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMNS)) { + return []; + } + return explode(',', $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMNS)); + } + + /** + * Get grid enabled for custom columns + * + * @return array + */ + public function getImageColumns(): array + { + if (!$this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMN_IMAGE)) { + return []; } + return explode(',', $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMN_IMAGE)); } + /** + * Get media product image width + * + * @return string + */ public function getProductImageWidth(): string { return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMN_IMAGE_WIDTH); } - } diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/Column.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/Column.php index 144a18cb044..435102f2023 100644 --- a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/Column.php +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/Column.php @@ -35,7 +35,6 @@ class Mage_Adminhtml_Model_System_Config_Source_Grid_Catalog_Product_Column 'price', 'date', 'weight', - 'media_image', 'select' ]; diff --git a/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/MediaImage.php b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/MediaImage.php new file mode 100644 index 00000000000..61b19a676a1 --- /dev/null +++ b/app/code/core/Mage/Adminhtml/Model/System/Config/Source/Grid/Catalog/Product/MediaImage.php @@ -0,0 +1,61 @@ +_attributes)) { + $attrCollection = Mage::getResourceModel('catalog/product_attribute_collection') + ->addVisibleFilter() + ->setFrontendInputTypeFilter($this->_supportedColumnsType) + ->addFieldToFilter('frontend_label', ['notnull' => true]) + ->setOrder('frontend_label', Varien_Data_Collection::SORT_ORDER_ASC); + + $this->_attributes = []; + /** @var Mage_Eav_Model_Attribute $attribute */ + foreach ($attrCollection as $attribute) { + $this->_attributes[] = [ + 'label' => $attribute->getFrontendLabel(), + 'value' => $attribute->getAttributeCode(), + ]; + } + } + return $this->_attributes; + } +} diff --git a/app/code/core/Mage/Core/etc/config.xml b/app/code/core/Mage/Core/etc/config.xml index 41927f247b7..003187da913 100644 --- a/app/code/core/Mage/Core/etc/config.xml +++ b/app/code/core/Mage/Core/etc/config.xml @@ -440,23 +440,23 @@ 0 - 64 + 64 0 - 64 + 64 0 - 64 + 64 0 - 64 + 64 0 - 64 + 64 diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index b459565bfc1..5cb7e054a43 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1681,7 +1681,7 @@ - + advanced 21 1 @@ -1689,14 +1689,15 @@ 0 - + 6 1 0 0 - + + select adminhtml/system_config_source_yesno 1 @@ -1705,7 +1706,8 @@ 0 - + + select adminhtml/system_config_source_yesno 2 @@ -1718,7 +1720,8 @@ - + + select adminhtml/system_config_source_yesno 3 @@ -1731,7 +1734,8 @@ - + + multiselect adminhtml/system_config_source_grid_catalog_product_column 4 @@ -1743,34 +1747,45 @@ 1 - - - - validate-number validate-zero-or-greater + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_mediaImage 5 1 0 0 - + 1 1 - + + + + + validate-number validate-zero-or-greater + 51 + 1 + 0 + 0 + + 1 + + + - + 6 1 0 0 - + + select adminhtml/system_config_source_yesno 1 @@ -1779,7 +1794,8 @@ 0 - + + select adminhtml/system_config_source_yesno 2 @@ -1792,7 +1808,8 @@ - + + select adminhtml/system_config_source_yesno 3 @@ -1805,7 +1822,8 @@ - + + multiselect adminhtml/system_config_source_grid_catalog_product_column 4 @@ -1817,34 +1835,45 @@ 1 - - - - validate-number validate-zero-or-greater + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_mediaImage 5 1 0 0 - + 1 1 - + + + + + validate-number validate-zero-or-greater + 51 + 1 + 0 + 0 + + 1 + + + - + 6 1 0 0 - + + select adminhtml/system_config_source_yesno 1 @@ -1853,7 +1882,8 @@ 0 - + + select adminhtml/system_config_source_yesno 2 @@ -1866,7 +1896,8 @@ - + + select adminhtml/system_config_source_yesno 3 @@ -1879,7 +1910,8 @@ - + + multiselect adminhtml/system_config_source_grid_catalog_product_column 4 @@ -1891,34 +1923,45 @@ 1 - - - - validate-number validate-zero-or-greater + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_mediaImage 5 1 0 0 - + 1 + + 1 + + + + + + validate-number validate-zero-or-greater + 51 + 1 + 0 + 0 1 + - + - + 6 1 0 0 - + + select adminhtml/system_config_source_yesno 1 @@ -1927,7 +1970,8 @@ 0 - + + select adminhtml/system_config_source_yesno 2 @@ -1940,7 +1984,8 @@ - + + select adminhtml/system_config_source_yesno 3 @@ -1953,7 +1998,8 @@ - + + multiselect adminhtml/system_config_source_grid_catalog_product_column 4 @@ -1965,34 +2011,45 @@ 1 - - - - validate-number validate-zero-or-greater + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_mediaImage 5 1 0 0 - + 1 1 - + + + + + validate-number validate-zero-or-greater + 51 + 1 + 0 + 0 + + 1 + + + - + 6 1 0 0 - + + select adminhtml/system_config_source_yesno 1 @@ -2001,7 +2058,8 @@ 0 - + + select adminhtml/system_config_source_yesno 2 @@ -2014,7 +2072,8 @@ - + + select adminhtml/system_config_source_yesno 3 @@ -2027,7 +2086,8 @@ - + + multiselect adminhtml/system_config_source_grid_catalog_product_column 4 @@ -2039,23 +2099,33 @@ 1 - - - - validate-number validate-zero-or-greater + + + + multiselect + adminhtml/system_config_source_grid_catalog_product_mediaImage 5 1 0 0 - + 1 + + 1 + + + + + + validate-number validate-zero-or-greater + 51 + 1 + 0 + 0 1 + - + From 87e625f09a097aa52aed50c73802ac7ce30b23b0 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 13:16:47 +0200 Subject: [PATCH 28/92] naming convention --- app/code/core/Mage/Adminhtml/Block/Widget/Grid.php | 8 ++++---- .../Block/Widget/Grid/Config/Product/Columns.php | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 3288021c418..af05a8fc214 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -566,7 +566,7 @@ protected function _setCollectionOrder($column) protected function _prepareCollection() { if ($this->getCollection()) { - $this->_prepareCollectionFromConfig(); + $this->_prepareCollectionAdvancedGrid(); $this->_preparePage(); $columnId = $this->getParam($this->getVarNameSort(), $this->_defaultSort); @@ -629,7 +629,7 @@ protected function _preparePage() */ protected function _prepareColumns() { - $this->_prepareColumnsFromConfig(); + $this->_prepareColumnsAdvancedGrid(); $this->sortColumnsByOrder(); return $this; } @@ -639,7 +639,7 @@ protected function _prepareColumns() * * @return $this */ - protected function _prepareCollectionFromConfig() + protected function _prepareCollectionAdvancedGrid() { return $this; } @@ -649,7 +649,7 @@ protected function _prepareCollectionFromConfig() * * @return $this */ - protected function _prepareColumnsFromConfig() + protected function _prepareColumnsAdvancedGrid() { return $this; } diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index e822061c1ae..3c5b46e524f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -40,7 +40,7 @@ protected function getHelperAdvancedGrid(): Mage_Adminhtml_Helper_Widget_Grid_Co * * @return $this */ - protected function _prepareCollectionFromConfig() + protected function _prepareCollectionAdvancedGrid() { if (!$this->getHelperAdvancedGrid()->isEnabled()) { return $this; @@ -71,7 +71,7 @@ protected function _prepareCollectionFromConfig() * * @return $this */ - protected function _prepareColumnsFromConfig() + protected function _prepareColumnsAdvancedGrid() { if (!$this->getHelperAdvancedGrid()->isEnabled()) { return $this; From d18713159245fa200866d28e0c6531d9c955eb26 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 13:21:11 +0200 Subject: [PATCH 29/92] phpcs --- .../Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 3c5b46e524f..3420315c27d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -24,7 +24,7 @@ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns { /* @var Mage_Adminhtml_Helper_Widget_Grid_Config $_helper */ - private $_helperAdvancedGrid = NULL; + private $_helperAdvancedGrid = null; protected function getHelperAdvancedGrid(): Mage_Adminhtml_Helper_Widget_Grid_Config { From 709bb7e1d27dc82e25c5b13603ff4cfc261dfd14 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 13:22:59 +0200 Subject: [PATCH 30/92] renaming methods --- .../Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 4 ++-- app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 3420315c27d..478df7b5a9f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -47,7 +47,7 @@ protected function _prepareCollectionAdvancedGrid() } /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ if ($this->getCollection()) { - foreach ($this->getHelperAdvancedGrid()->getColumns() as $attributeCode) { + foreach ($this->getHelperAdvancedGrid()->getAttributeColumns() as $attributeCode) { $this->getCollection()->addAttributeToSelect($attributeCode); } @@ -125,7 +125,7 @@ protected function _prepareColumnsAdvancedGrid() $_keepOrder = 'updated_at'; } - foreach ($this->getHelperAdvancedGrid()->getColumns() as $attributeCode) { + foreach ($this->getHelperAdvancedGrid()->getAttributeColumns() as $attributeCode) { /** @var Mage_Eav_Model_Attribute $_attributeEntity */ $_attributeEntity = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, $attributeCode); switch ($_attributeEntity->getFrontendInput()) { diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php index f39fa62c219..ed98f42c1ba 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -105,7 +105,7 @@ public function isUpdatedAtEnabled() * * @return array */ - public function getColumns(): array + public function getAttributeColumns(): array { if (!$this->getStoreConfigGridId(self::CONFIG_PATH_GRID_COLUMNS)) { return []; From e29ff213ed73154f39b1ac13b8ceafeb5a517928 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 13:45:22 +0200 Subject: [PATCH 31/92] fix doc --- .../Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 478df7b5a9f..3e359189b7a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -23,7 +23,7 @@ */ trait Mage_Adminhtml_Block_Widget_Grid_Config_Product_Columns { - /* @var Mage_Adminhtml_Helper_Widget_Grid_Config $_helper */ + /* @var Mage_Adminhtml_Helper_Widget_Grid_Config $_helperAdvancedGrid */ private $_helperAdvancedGrid = null; protected function getHelperAdvancedGrid(): Mage_Adminhtml_Helper_Widget_Grid_Config From 9334643082c3a10c9fb1cf1d1ebd078f1c255545 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 17:23:11 +0200 Subject: [PATCH 32/92] phpcs --- app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php index ed98f42c1ba..a4ca8f5d977 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -63,7 +63,8 @@ public function getGridId(): string * @throws Mage_Core_Exception */ public function getStoreConfigGridId($configPath) - { if(!$this->_gridId) { + { + if(!$this->_gridId) { Mage::throwException(Mage::helper('adminhtml')->__('Grid Id must be set.')); } $config = sprintf($configPath, $this->_gridId); From e41b0ba53369762bed6dd3d6a91071681b79671b Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 17:36:10 +0200 Subject: [PATCH 33/92] phpcs --- .../Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 2 +- app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 3e359189b7a..7171db00c62 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -46,7 +46,7 @@ protected function _prepareCollectionAdvancedGrid() return $this; } /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ - if ($this->getCollection()) { + if ($this->getCollection()) { foreach ($this->getHelperAdvancedGrid()->getAttributeColumns() as $attributeCode) { $this->getCollection()->addAttributeToSelect($attributeCode); } diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php index a4ca8f5d977..8332d1fbd75 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -64,7 +64,7 @@ public function getGridId(): string */ public function getStoreConfigGridId($configPath) { - if(!$this->_gridId) { + if (!$this->_gridId) { Mage::throwException(Mage::helper('adminhtml')->__('Grid Id must be set.')); } $config = sprintf($configPath, $this->_gridId); From cabef7619e487d714451992da37fe65326c835b3 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 24 Aug 2023 17:37:45 +0200 Subject: [PATCH 34/92] phpstan --- .../Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index 7171db00c62..d9d28e9890a 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -45,7 +45,6 @@ protected function _prepareCollectionAdvancedGrid() if (!$this->getHelperAdvancedGrid()->isEnabled()) { return $this; } - /** @var Mage_Core_Model_Resource_Db_Collection_Abstract $this->getCollection() */ if ($this->getCollection()) { foreach ($this->getHelperAdvancedGrid()->getAttributeColumns() as $attributeCode) { $this->getCollection()->addAttributeToSelect($attributeCode); From 2391f615e512bf2f9a6ccfaab75ce857e86cc37a Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 29 Aug 2023 16:40:31 +0200 Subject: [PATCH 35/92] WIP add order column by drag&drop --- .../Widget/Grid/Config/Product/Columns.php | 36 ++++-- .../Adminhtml/Helper/Widget/Grid/Config.php | 18 +++ .../controllers/Catalog/ProductController.php | 14 ++ .../default/template/widget/grid.phtml | 121 +++++++++++++++++- 4 files changed, 176 insertions(+), 13 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php index d9d28e9890a..fa3b96e4b0b 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Config/Product/Columns.php @@ -77,7 +77,7 @@ protected function _prepareColumnsAdvancedGrid() } $storeId = (int) $this->getRequest()->getParam('store', 0); - $_keepOrder = 'entity_id'; + $_keepDefaultOrder = 'entity_id'; foreach ($this->getHelperAdvancedGrid()->getImageColumns() as $attributeCode) { /** @var Mage_Eav_Model_Attribute $_attributeEntity */ @@ -91,9 +91,9 @@ protected function _prepareColumnsAdvancedGrid() 'index' => $attributeCode, 'attribute_code' => $attributeCode, ], - $_keepOrder + $_keepDefaultOrder ); - $_keepOrder = $attributeCode; + $_keepDefaultOrder = $attributeCode; } if ($this->getHelperAdvancedGrid()->isCreatedAtEnabled()) { @@ -105,9 +105,9 @@ protected function _prepareColumnsAdvancedGrid() 'index' => 'created_at', 'attribute_code' => 'created_at', ], - $_keepOrder + $_keepDefaultOrder ); - $_keepOrder = 'created_at'; + $_keepDefaultOrder = 'created_at'; } if ($this->getHelperAdvancedGrid()->isUpdatedAtEnabled()) { @@ -119,9 +119,9 @@ protected function _prepareColumnsAdvancedGrid() 'index' => 'updated_at', 'attribute_code' => 'updated_at', ], - $_keepOrder + $_keepDefaultOrder ); - $_keepOrder = 'updated_at'; + $_keepDefaultOrder = 'updated_at'; } foreach ($this->getHelperAdvancedGrid()->getAttributeColumns() as $attributeCode) { @@ -139,7 +139,7 @@ protected function _prepareColumnsAdvancedGrid() 'attribute_code' => $attributeCode, 'currency_code' => $_currency, ], - $_keepOrder + $_keepDefaultOrder ); break; case 'date': @@ -151,7 +151,7 @@ protected function _prepareColumnsAdvancedGrid() 'index' => $attributeCode, 'attribute_code' => $attributeCode, ], - $_keepOrder + $_keepDefaultOrder ); break; case 'multiselect': @@ -173,7 +173,7 @@ protected function _prepareColumnsAdvancedGrid() 'options' => $_options, 'attribute_code' => $attributeCode, ], - $_keepOrder + $_keepDefaultOrder ); break; default: @@ -185,11 +185,23 @@ protected function _prepareColumnsAdvancedGrid() 'index' => $attributeCode, 'attribute_code' => $attributeCode, ], - $_keepOrder + $_keepDefaultOrder ); break; } - $_keepOrder = $attributeCode; + $_keepDefaultOrder = $attributeCode; + } + + // customize order column + $_orderColumns = $this->getHelperAdvancedGrid()->getOrderColumns(); + if ($_orderColumns) { + // Reset Column Order + $this->_columnsOrder = []; + uksort($this->_columns, function($a, $b) use ($_orderColumns) { + $posA = array_search($a, $_orderColumns); + $posB = array_search($b, $_orderColumns); + return $posA > $posB; + }); } return $this; } diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php index 8332d1fbd75..822966793ab 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -24,6 +24,7 @@ class Mage_Adminhtml_Helper_Widget_Grid_Config extends Mage_Core_Helper_Abstract { public const CONFIG_PATH_GRID_ENABLED = 'advanced_grid/%s/enabled'; public const CONFIG_PATH_GRID_COLUMNS = 'advanced_grid/%s/columns'; + public const CONFIG_PATH_GRID_ORDER = 'advanced_grid/%s/order'; public const CONFIG_PATH_GRID_CREATED_AT = 'advanced_grid/%s/created_at'; public const CONFIG_PATH_GRID_UPDATED_AT = 'advanced_grid/%s/updated_at'; public const CONFIG_PATH_GRID_COLUMN_IMAGE = 'advanced_grid/%s/media_image'; @@ -71,6 +72,23 @@ public function getStoreConfigGridId($configPath) return Mage::getStoreConfig($config); } + + public function saveOrderColumns($value) + { + $configPath = sprintf(self::CONFIG_PATH_GRID_ORDER, $this->_gridId); + Mage::getModel('core/config')->saveConfig($configPath, $value); + } + + public function getOrderColumns() : array + { + $data = $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_ORDER); + if(!$data) return []; + + $data = Mage::helper('core')->jsonDecode($data); + return $data; + } + + /** * Get grid enabled for custom columns * diff --git a/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php b/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php index a10f7e2e719..369874f9106 100644 --- a/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php +++ b/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php @@ -302,6 +302,20 @@ public function wysiwygAction() $this->getResponse()->setBody($content->toHtml()); } + /** + * Grid reorder columns action for ajax request + */ + public function gridColumnReorderAction() + { + $gridId = $this->getRequest()->getPost('gridId'); + $data = $this->getRequest()->getPost('data'); + if(!$gridId || !$data) return false; + + Mage::helper('adminhtml/widget_grid_config') + ->setGridId($gridId) + ->saveOrderColumns($data); + } + /** * Product grid for AJAX request */ diff --git a/app/design/adminhtml/default/default/template/widget/grid.phtml b/app/design/adminhtml/default/default/template/widget/grid.phtml index d28723ea8ca..856c8846200 100644 --- a/app/design/adminhtml/default/default/template/widget/grid.phtml +++ b/app/design/adminhtml/default/default/template/widget/grid.phtml @@ -114,7 +114,7 @@ $numColumns = count($this->getColumns()); getHeadersVisibility()): ?> getColumns() as $_column): ?> - getHeaderHtmlProperty() ?>>getHeaderHtml() ?> + getHeaderHtmlProperty() ?>>getHeaderHtml() ?> @@ -194,6 +194,125 @@ $numColumns = count($this->getColumns()); + + canDisplayContainer()): ?> canDisplayContainer()): ?> From 89cc900cefa55c8b6b140ac2cbe22df84cea5f1f Mon Sep 17 00:00:00 2001 From: Tony Date: Tue, 29 Aug 2023 19:51:45 +0200 Subject: [PATCH 41/92] WIP --- .../default/default/template/widget/grid.phtml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/design/adminhtml/default/default/template/widget/grid.phtml b/app/design/adminhtml/default/default/template/widget/grid.phtml index 120af29ec28..486d6db89c9 100644 --- a/app/design/adminhtml/default/default/template/widget/grid.phtml +++ b/app/design/adminhtml/default/default/template/widget/grid.phtml @@ -229,7 +229,7 @@ $numColumns = count($this->getColumns()); [].forEach.call(cols, function(col) { col.classList.remove('overDrag'); col.classList.remove('overDrag__left'); - col.classList.remove('overDrag_right'); + col.classList.remove('overDrag__right'); }); // disable drop self @@ -241,12 +241,12 @@ $numColumns = count($this->getColumns()); if (isBefore(_currentDragItem, _dest)) { this.classList.add('overDrag__left'); }else{ - this.classList.add('overDrag_right'); + this.classList.add('overDrag__right'); } } function listenerDragLeave(e) { - //this.classList.remove('overDrag').remove('overDrag__left').remove('overDrag_right'); + //this.classList.remove('overDrag').remove('overDrag__left').remove('overDrag__right'); } @@ -275,7 +275,7 @@ $numColumns = count($this->getColumns()); [].forEach.call(cols, function(col) { col.classList.remove('overDrag'); col.classList.remove('overDrag__left'); - col.classList.remove('overDrag_right'); + col.classList.remove('overDrag__right'); }); if (_columnOrderChanged) { @@ -342,7 +342,7 @@ $numColumns = count($this->getColumns()); .overDrag__left::after { left: -10px; } - .overDrag_right::after { + .overDrag__right::after { right: -10px; } From 3f8f563d48b893ecf5d5cf9c23e1a0a64c1ce0e5 Mon Sep 17 00:00:00 2001 From: Tony Date: Wed, 30 Aug 2023 11:25:55 +0200 Subject: [PATCH 42/92] WIP better javascript --- .../default/template/widget/grid.phtml | 302 ++++++++++-------- 1 file changed, 172 insertions(+), 130 deletions(-) diff --git a/app/design/adminhtml/default/default/template/widget/grid.phtml b/app/design/adminhtml/default/default/template/widget/grid.phtml index 486d6db89c9..43b027028da 100644 --- a/app/design/adminhtml/default/default/template/widget/grid.phtml +++ b/app/design/adminhtml/default/default/template/widget/grid.phtml @@ -194,135 +194,6 @@ $numColumns = count($this->getColumns()); - canDisplayContainer()): ?> From 92aea285c78bb45672c23b0755986e0189e14865 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Thu, 14 Sep 2023 16:24:31 +0100 Subject: [PATCH 59/92] css in external file, fixed symbol too --- skin/adminhtml/default/default/boxes.css | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index cc0f3619a11..a7b30e07423 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -158,7 +158,7 @@ table.actions td { vertical-align:top; } /* Grid - Headings */ -.grid tr.headings { background:url(images/sort_row_bg.gif) 0 50% repeat-x; } +.grid tr.headings { background:url(images/sort_row_bg.gif) 0 50% repeat-x; position: relative;} .grid tr.headings th { border-width:1px; border-color:#f9f9f9 #d1cfcf #f9f9f9 #f9f9f9; border-style:solid; padding-top:1px; padding-bottom:0; font-size:.9em; } .grid tr.headings th.last { border-right:0; } .grid tr.headings th.no-link { /* Grid th with no sorting functionality */ padding-top:2px; padding-bottom:1px; color:#67767e; } @@ -187,7 +187,6 @@ table.actions td { vertical-align:top; } .massaction a { text-decoration:none; } .massaction .entry-edit fieldset span.form_row, .massaction .entry-edit fieldset span.field-row { clear:none !important; display:inline; float:left !important; margin:0; padding:0 5px 0 0; } - .massaction .entry-edit .outer-span { float:left; } /* Grid - Filter */ @@ -221,6 +220,12 @@ tr.dynamic-grid input.input-text { width:154px; } .available { color:#080; font-weight:bold; } .not-available { color:#800; } +/* Grid heading drag&drop */ +.overDrag { background-color: red !important; } +.overDrag:after { content: '↑'; position: absolute; overflow: hidden; color: red; z-index: 99999999999999; font-weight: bold; font-size: 20px; } +.overDrag__left::after { left: -10px; } +.overDrag__right::after { right: -10px; } + /* ACCORDION *******************************************************************************/ From 6ac0270288cb553589cfc20f5379689303303a11 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Thu, 14 Sep 2023 16:24:50 +0100 Subject: [PATCH 60/92] removed comments --- js/mage/adminhtml/grid.js | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index 0607cd538b9..2380e3fd42f 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -202,22 +202,6 @@ varienGrid.prototype = { location.href = url; } }, - /*_processComplete : function(transport){ - console.log(transport); - if (transport && transport.responseText){ - try{ - response = eval('(' + transport.responseText + ')'); - } - catch (e) { - response = {}; - } - } - if (response.ajaxExpired && response.ajaxRedirect) { - location.href = response.ajaxRedirect; - return false; - } - this.initGrid(); - },*/ _processFailure : function(transport){ location.href = BASE_URL; }, @@ -254,7 +238,6 @@ varienGrid.prototype = { if (!$(this.containerId)) { return; } -// var dataElements = $(this.containerId+this.tableSufix).down('.data tbody').select('input', 'select'); var dataElements = $(this.containerId+this.tableSufix).down('tbody').select('input', 'select'); for(var i=0; i Date: Thu, 14 Sep 2023 16:30:05 +0100 Subject: [PATCH 61/92] fixed whitespace and license --- .../Block/Widget/Grid/Column/Renderer/Productimage.php | 6 ++---- app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php | 4 +--- .../Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php | 5 ++--- .../Adminhtml/Helper/Widget/Grid/Config/Catalog/Product.php | 6 +++--- .../Mage/Adminhtml/Helper/Widget/Grid/Config/Interface.php | 4 +--- .../System/Config/Source/Grid/Catalog/Product/Column.php | 4 +--- .../Config/Source/Grid/Catalog/Product/GridIdList.php | 4 +--- .../Config/Source/Grid/Catalog/Product/MediaImage.php | 4 +--- 8 files changed, 12 insertions(+), 25 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php index fad96f114ca..d7af55e5ed7 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Productimage.php @@ -1,5 +1,4 @@ _checkImageIsSelected($row); if (!$image) { return ''; - //return ''; } $imageDimensions = $this->getColumn()->getWidth() ?: $this->_defaultWidth; $imageSrc = $this->_getHelperImage($image)->resize($imageDimensions, $imageDimensions); diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php index c70905b7366..1010b32b951 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config.php @@ -1,5 +1,4 @@ isEnabled()) { return $this; } + if ($collection) { foreach ($this->getAttributeColumns() as $attributeCode) { $collection->addAttributeToSelect($attributeCode); @@ -56,6 +55,7 @@ public function applyAdvancedGridCollection($collection) $collection->addAttributeToSelect('updated_at'); } } + return $this; } diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Interface.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Interface.php index b4fdeba45b9..d9ede263a8f 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Interface.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Interface.php @@ -1,5 +1,4 @@ Date: Thu, 14 Sep 2023 17:11:01 +0100 Subject: [PATCH 62/92] Added strings to locale CSV --- app/code/core/Mage/Core/etc/system.xml | 12 ++++++------ app/locale/en_US/Mage_Adminhtml.csv | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index 7987d1d1206..b054f2f00f7 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1751,7 +1751,7 @@ - + validate-number validate-zero-or-greater 51 1 @@ -1836,7 +1836,7 @@ - + validate-number validate-zero-or-greater 51 1 @@ -1921,7 +1921,7 @@ - + validate-number validate-zero-or-greater 51 1 @@ -2006,7 +2006,7 @@ - + validate-number validate-zero-or-greater 51 1 @@ -2091,7 +2091,7 @@ - + validate-number validate-zero-or-greater 51 1 @@ -2176,7 +2176,7 @@ - + validate-number validate-zero-or-greater 51 1 diff --git a/app/locale/en_US/Mage_Adminhtml.csv b/app/locale/en_US/Mage_Adminhtml.csv index 0b92426f3f9..cfe70b54e09 100644 --- a/app/locale/en_US/Mage_Adminhtml.csv +++ b/app/locale/en_US/Mage_Adminhtml.csv @@ -83,6 +83,7 @@ "Additional Cache Management","Additional Cache Management" "Address Type:","Address Type:" "Admin","Admin" +"Admin Grids","Admin Grids" "Advanced Profiles","Advanced Profiles" "After authorization application will have access to you account.","After authorization application will have access to you account." "Alert","Alert" @@ -821,6 +822,8 @@ "Products Most Viewed Report","Products Most Viewed Report" "Products Ordered","Products Ordered" "Products in Carts","Products in Carts" +"Product Image Preview","Product Image Preview" +"Product Image Width","Product Image Width" "Profile Action","Profile Action" "Profile Actions XML","Profile Actions XML" "Profile Direction","Profile Direction" @@ -939,6 +942,9 @@ "Selected base currency is not available in installed currencies.","Selected base currency is not available in installed currencies." "Selected default display currency is not available in allowed currencies.","Selected default display currency is not available in allowed currencies." "Selected default display currency is not available in installed currencies.","Selected default display currency is not available in installed currencies." +"Select product attributes to show as column in grid","Select product attributes to show as column in grid" +"Select product media image types","Select product media image types" +"Set product image preview width, in pixels (eg: 64)","Set product image preview width, in pixels (eg: 64)" "Self-assigned roles cannot be deleted.","Self-assigned roles cannot be deleted." "Sender","Sender" "Separate Email","Separate Email" From 63751b9ce28232c5a35d3afd1fb5b4bd5a9d0055 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Thu, 14 Sep 2023 17:16:10 +0100 Subject: [PATCH 63/92] Fixed some label/comment translations --- app/code/core/Mage/Core/etc/system.xml | 50 ++++++++++++-------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index b054f2f00f7..2e16c15997a 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1679,14 +1679,14 @@ 0 0 - + 1 1 0 0 - + select adminhtml/system_config_source_yesno @@ -1759,19 +1759,18 @@ 0 1 - - + 2 1 0 0 - + select adminhtml/system_config_source_yesno @@ -1806,7 +1805,7 @@ 1 - + multiselect @@ -1820,7 +1819,7 @@ 1 - + multiselect @@ -1844,19 +1843,18 @@ 0 1 - - + 3 1 0 0 - + select adminhtml/system_config_source_yesno @@ -1891,7 +1889,7 @@ 1 - + multiselect @@ -1905,7 +1903,7 @@ 1 - + multiselect @@ -1929,19 +1927,18 @@ 0 1 - - + 4 1 0 0 - + select adminhtml/system_config_source_yesno @@ -1976,7 +1973,7 @@ 1 - + multiselect @@ -1990,7 +1987,7 @@ 1 - + multiselect @@ -2014,19 +2011,18 @@ 0 1 - - + 5 1 0 0 - + select adminhtml/system_config_source_yesno @@ -2061,7 +2057,7 @@ 1 - + multiselect @@ -2075,7 +2071,7 @@ 1 - + multiselect @@ -2099,19 +2095,18 @@ 0 1 - - + 6 1 0 0 - + select adminhtml/system_config_source_yesno @@ -2146,7 +2141,7 @@ 1 - + multiselect @@ -2160,7 +2155,7 @@ 1 - + multiselect @@ -2184,7 +2179,6 @@ 0 1 - From 47f681e8e30b94752cd538bd72a8d6db4f0ac3d9 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Thu, 14 Sep 2023 17:43:46 +0100 Subject: [PATCH 64/92] Added strings to locale CSV --- app/locale/en_US/Mage_Adminhtml.csv | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/locale/en_US/Mage_Adminhtml.csv b/app/locale/en_US/Mage_Adminhtml.csv index cfe70b54e09..645ad4bc15d 100644 --- a/app/locale/en_US/Mage_Adminhtml.csv +++ b/app/locale/en_US/Mage_Adminhtml.csv @@ -226,6 +226,12 @@ "Catalog","Catalog" "Catalog Price Rules","Catalog Price Rules" "Catalog Rewrites","Catalog Rewrites" +"Catalog > Manage Products","Catalog > Manage Products" +"Catalog > Manage Products > Edit | Related Products","Catalog > Manage Products > Edit | Related Products" +"Catalog > Manage Products > Edit | Up-Sells","Catalog > Manage Products > Edit | Up-Sells" +"Catalog > Manage Products > Edit | Cross-Sells","Catalog > Manage Products > Edit | Cross-Sells" +"Catalog > Manage Products > Edit | Associated Products","Catalog > Manage Products > Edit | Associated Products" +"Catalog > Manage Categories | Category Products","Catalog > Manage Categories | Category Products" "Categories","Categories" "Category","Category" "Category:","Category:" From b9757faee49bde3c65dd314381902d7e9f029d96 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 16 Sep 2023 12:42:34 +0200 Subject: [PATCH 65/92] add controls to column sorting --- .../core/Mage/Adminhtml/Block/Widget/Grid.php | 42 ++++++ .../Block/Widget/Grid/Advanced/Abstract.php | 8 ++ .../Adminhtml/controllers/GridController.php | 3 +- .../default/template/widget/grid.phtml | 2 +- js/mage/adminhtml/grid.js | 125 +++++++++++++++++- skin/adminhtml/default/default/boxes.css | 14 +- 6 files changed, 184 insertions(+), 10 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index f3974a2c014..b4e6ce8017f 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -294,6 +294,22 @@ public function getExportButtonHtml() return $this->getChildHtml('export_button'); } + /** + * @return string + */ + public function getResetColumnsButtonHtml() + { + return $this->getChildHtml('reset_columns_order_button'); + } + + /** + * @return string + */ + public function getToggleColumnsOrderButtonHtml() + { + return $this->getChildHtml('toggle_columns_order_button'); + } + /** * @return string */ @@ -316,6 +332,10 @@ public function getSearchButtonHtml() public function getMainButtonsHtml() { $html = ''; + if ($this->getHelperAdvancedGrid()->isEnabled()) { + $html .= $this->getToggleColumnsOrderButtonHtml(); + $html .= $this->getResetColumnsButtonHtml(); + } if ($this->getFilterVisibility()) { $html .= $this->getResetFilterButtonHtml(); $html .= $this->getSearchButtonHtml(); @@ -662,6 +682,28 @@ protected function _prepareColumns() protected function _prepareAdvancedGridBlock() { $this->setChild('advanced_grid', $this->getLayout()->createBlock($this->getAdvancedGridBlockName())); + + if ($this->getHelperAdvancedGrid()->isEnabled()) { + $this->setChild( + 'toggle_columns_order_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData([ + 'id' => 'toggle_columns_order_button', + 'label' => Mage::helper('adminhtml')->__('Sort Columns'), + //'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.enableColumnsOrder(this)', + ]) + ); + $this->setChild( + 'reset_columns_order_button', + $this->getLayout()->createBlock('adminhtml/widget_button') + ->setData([ + 'id' => 'reset_columns_order_button', + 'label' => Mage::helper('adminhtml')->__('Reset Columns Order'), + 'class' => 'delete', + //'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.resetColumnsOrder()', + ]) + ); + } return $this; } diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php index ccdfa326712..af4bc9cd449 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php @@ -33,6 +33,14 @@ public function __construct() //$this->setTemplate('widget/grid/advanced.phtml'); } + /** + * @return string + */ + public function getHtmlId() + { + return $this->getParentBlock()->getHtmlId() . '_advanced'; + } + /** * Retrieve advanced block js object name * diff --git a/app/code/core/Mage/Adminhtml/controllers/GridController.php b/app/code/core/Mage/Adminhtml/controllers/GridController.php index 8f8141f7c84..5b03976539c 100644 --- a/app/code/core/Mage/Adminhtml/controllers/GridController.php +++ b/app/code/core/Mage/Adminhtml/controllers/GridController.php @@ -28,7 +28,8 @@ public function saveColumnOrderAction() { $gridId = $this->getRequest()->getPost('gridId'); $data = $this->getRequest()->getPost('data'); - if (!$gridId || !$data) { + $reset = $this->getRequest()->getPost('reset'); + if (!$gridId || (!$data AND !$reset)) { return false; } diff --git a/app/design/adminhtml/default/default/template/widget/grid.phtml b/app/design/adminhtml/default/default/template/widget/grid.phtml index 015745a592c..2c189ca567f 100644 --- a/app/design/adminhtml/default/default/template/widget/grid.phtml +++ b/app/design/adminhtml/default/default/template/widget/grid.phtml @@ -114,7 +114,7 @@ $numColumns = count($this->getColumns()); getHeadersVisibility()): ?> getColumns() as $key => $_column): ?> - getHeaderHtmlProperty() ?>>getHeaderHtml() ?> + getHeaderHtmlProperty() ?>>getHeaderHtml() ?> diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index 2380e3fd42f..817729a70e1 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -907,34 +907,108 @@ class varienGridAdvanced { _currentDragItem = ''; _targetDragColumn = ''; _currentColumnsOrder = []; + _enabled = false; _columnOrderChanged = false; oldCallbacks = {}; _columnSelector = 'tr.headings th'; + _btnToggleSelector = 'toggle_columns_order_button'; + _btnResetSelector = 'reset_columns_order_button'; constructor(containerId, grid, url) { this.containerId = containerId; this.grid = grid; this.url = url; - this.initReorderColumns(); this.setOldCallback('init', grid.initCallback); this.grid.initCallback = this.onGridInit.bind(this); - + this.initReorderColumns(); } initReorderColumns() { + if (this._enabled) { + this.enableColumnsOrder() + } else { + this.disableColumnsOrder(); + } + this._saveCurrentColumnsOrder(); + } + + enableColumnsOrder() { this.getColumns().forEach((elm) => { + elm.setAttribute('draggable', true); elm.addEventListener('dragstart', this.onDragStart.bind(this), false); elm.addEventListener('dragenter', this.onDragEnter.bind(this), false); elm.addEventListener('dragover', this.onDragOver.bind(this), false); //elm.addEventListener('dragleave', this.onDragLeave.bind(this), false); elm.addEventListener('drop', this.onDrop.bind(this), false); elm.addEventListener('dragend', this.onDragEnd.bind(this), false); - }, this); - this._saveCurrentColumnsOrder(); + this._wrap(elm); + }); + this._getResetBtn().style.display = 'inherit'; + + this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); + this._getToggleBtn().addEventListener('click', this.disableColumnsOrder.bind(this), false); + + this._enabled = true; + } + + disableColumnsOrder() { + this.getColumns().forEach((elm) => { + elm.removeAttribute('draggable'); + this._unwrap(elm); + elm.replaceWith(elm.cloneNode(true)); + }); + this._getResetBtn().style.display = 'none'; + + this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); + this._getToggleBtn().addEventListener('click', this.enableColumnsOrder.bind(this), false); + + this._enabled = false; + } + + buildDragPreview(elm) { + const _columnIndex = elm.cellIndex + 1; + + const _tableColPReview = document.createElement('table'); + _tableColPReview.style.width = elm.getBoundingClientRect().width + 'px'; + + const _tHead = _tableColPReview.createTHead(); + + const trHeading = _tHead.insertRow(); + trHeading.classList.add('headings'); + trHeading.append(elm.clone(true)); + + const trFilter = _tHead.insertRow(); + trFilter.classList.add('filter'); + const _selectorFilterRows = 'thead tr.filter th:nth-child(' + _columnIndex + ')'; + Array.from(elm.closest('table').querySelectorAll( _selectorFilterRows )).forEach((row) => { + trFilter.appendChild(row.clone(true)); + }); + + const _tBody = _tableColPReview.createTBody(); + const _selectorRows = 'tbody td:nth-child(' + _columnIndex + ')'; + Array.from(elm.closest('table').querySelectorAll( _selectorRows )).forEach((row) => { + const tr = _tBody.insertRow(); + tr.appendChild(row.clone(true)); + }); + + + const previewGrid = document.createElement('div'); + previewGrid.classList.add('grid'); + previewGrid.classList.add('grid__dragPreview'); + previewGrid.style.width = elm.getBoundingClientRect().width + 'px'; + previewGrid.setAttribute('id', 'dragPreview_placeholder') + previewGrid.append(_tableColPReview); + console.log(_tableColPReview); + return previewGrid; } onDragStart(e) { + const placeholder = this.buildDragPreview(e.target.closest(this._columnSelector)); + document.body.appendChild(placeholder); + e.dataTransfer.setDragImage(placeholder, 0, 0); + + e.dataTransfer.effectAllowed = "copyMove"; e.dataTransfer.setData("text/plain", null); this._currentDragItem = e.target.closest(this._columnSelector); @@ -958,7 +1032,7 @@ class varienGridAdvanced { if(this._isSameColumn(_currentTargetColumn)) { this._targetDragColumn = null; return false; - } + } this._targetDragColumn = _currentTargetColumn; @@ -993,8 +1067,23 @@ class varienGridAdvanced { return false; } + resetColumnsOrder() { + new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { + method: 'post', + dataType: "json", + parameters: { + "gridId": this.containerId, + "reset": true + }, + onComplete: this.onReorderComplete.bind(this), + onSuccess: function(transport) {} + }, this); + } + onDragEnd(e) { this._resetClassStyle(); + + document.getElementById('dragPreview_placeholder').remove(); if (this._columnOrderChanged) { new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { @@ -1025,6 +1114,7 @@ class varienGridAdvanced { } onGridInit(grid) { + console.log('inGridInit') this.initReorderColumns(); this.getOldCallback('init')(grid); } @@ -1037,6 +1127,14 @@ class varienGridAdvanced { return Array.from(document.querySelectorAll(tableContainer + ' ' +this._columnSelector)); } + _getToggleBtn() { + return document.getElementById(this._btnToggleSelector); + } + + _getResetBtn() { + return document.getElementById(this._btnResetSelector); + } + _saveCurrentColumnsOrder(orderChanged = false) { this._currentColumnsOrder = []; this.getColumns().forEach((elm) => { @@ -1073,4 +1171,21 @@ class varienGridAdvanced { elm.classList.remove('overDrag__right'); }); } + + _wrap(target) { + if (!target.querySelector('.draggable')) { + let wrapper = document.createElement('span'); + wrapper.classList.add('draggable'); + [ ...target.childNodes ].forEach(child => wrapper.appendChild(child)); + target.appendChild(wrapper); + return wrapper; + } + } + + _unwrap(target) { + let wrapper = target.querySelector('.draggable'); + if (wrapper) { + target.querySelector('.draggable').replaceWith(...target.querySelector('.draggable').childNodes); + } + } } \ No newline at end of file diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index a7b30e07423..9c707b3bb2f 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -221,11 +221,19 @@ tr.dynamic-grid input.input-text { width:154px; } .not-available { color:#800; } /* Grid heading drag&drop */ -.overDrag { background-color: red !important; } -.overDrag:after { content: '↑'; position: absolute; overflow: hidden; color: red; z-index: 99999999999999; font-weight: bold; font-size: 20px; } +.overDrag { background-color: rgba(255, 255, 255, 0.60) !important; } +.overDrag:after { content: '▲'; position: absolute; overflow: hidden; color: red; z-index: 99999999999999; font-weight: bold; font-size: 18px; } .overDrag__left::after { left: -10px; } .overDrag__right::after { right: -10px; } - +.grid__dragPreview { border: 1px solid red; } +.grid tr.headings th[draggable], +.grid tr.headings th[draggable] a { cursor: move; position: relative; } +.grid tr.headings th[draggable] span.draggable { display: flex; gap: 8px; align-items: center; } +.grid tr.headings th[draggable] span.draggable:before { + content: url('data:image/svg+xml,'); + width: 12px; + height: 12px; +} /* ACCORDION *******************************************************************************/ From eef88a4d854392be39430f74e0e785bd67d01970 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 16 Sep 2023 12:54:17 +0200 Subject: [PATCH 66/92] phpcs --- app/code/core/Mage/Adminhtml/Block/Widget/Grid.php | 2 +- app/code/core/Mage/Adminhtml/controllers/GridController.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index b4e6ce8017f..e6cf233da2d 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -682,7 +682,7 @@ protected function _prepareColumns() protected function _prepareAdvancedGridBlock() { $this->setChild('advanced_grid', $this->getLayout()->createBlock($this->getAdvancedGridBlockName())); - + if ($this->getHelperAdvancedGrid()->isEnabled()) { $this->setChild( 'toggle_columns_order_button', diff --git a/app/code/core/Mage/Adminhtml/controllers/GridController.php b/app/code/core/Mage/Adminhtml/controllers/GridController.php index 5b03976539c..d6bb928eb9d 100644 --- a/app/code/core/Mage/Adminhtml/controllers/GridController.php +++ b/app/code/core/Mage/Adminhtml/controllers/GridController.php @@ -29,7 +29,7 @@ public function saveColumnOrderAction() $gridId = $this->getRequest()->getPost('gridId'); $data = $this->getRequest()->getPost('data'); $reset = $this->getRequest()->getPost('reset'); - if (!$gridId || (!$data AND !$reset)) { + if (!$gridId || (!$data && !$reset)) { return false; } From 85dd828ac5b99deb8d626d3ac24b5824cb1edae4 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 16 Sep 2023 13:25:02 +0200 Subject: [PATCH 67/92] add confirm reset columns order --- .../core/Mage/Adminhtml/Block/Widget/Grid.php | 2 +- .../Block/Widget/Grid/Advanced/Abstract.php | 7 ++++-- js/mage/adminhtml/grid.js | 25 +++++++++++-------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index e6cf233da2d..90014445460 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -700,7 +700,7 @@ protected function _prepareAdvancedGridBlock() 'id' => 'reset_columns_order_button', 'label' => Mage::helper('adminhtml')->__('Reset Columns Order'), 'class' => 'delete', - //'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.resetColumnsOrder()', + 'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.resetColumnsOrder()', ]) ); } diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php index af4bc9cd449..09f4c1b17f5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php @@ -30,6 +30,7 @@ abstract class Mage_Adminhtml_Block_Widget_Grid_Advanced_Abstract extends Mage_A public function __construct() { parent::__construct(); + $this->setResetConfirmText(Mage::helper('core')->jsQuoteEscape(Mage::helper('core')->__('Are you sure? The columns order will be resetted to default'))); //$this->setTemplate('widget/grid/advanced.phtml'); } @@ -76,13 +77,15 @@ public function getGridId(): mixed */ public function getJavaScript(): string { - return sprintf( - "var %s = new varienGridAdvanced('%s', %s, '%s')", + $_content = sprintf( + "var %s = new varienGridAdvanced('%s', %s, '%s');", $this->getJsObjectName(), $this->getGridId(), $this->getGridJsObjectName(), $this->getUrl('adminhtml/grid/saveColumnOrder') ); + $_content.="{$this->getJsObjectName()}.resetConfirmText = '{$this->getResetConfirmText()}';"; + return $_content; } /** diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index 817729a70e1..c1bf7c1106b 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -913,6 +913,7 @@ class varienGridAdvanced { _columnSelector = 'tr.headings th'; _btnToggleSelector = 'toggle_columns_order_button'; _btnResetSelector = 'reset_columns_order_button'; + resetConfirmText = 'Are you sure?' constructor(containerId, grid, url) { this.containerId = containerId; @@ -956,7 +957,7 @@ class varienGridAdvanced { this.getColumns().forEach((elm) => { elm.removeAttribute('draggable'); this._unwrap(elm); - elm.replaceWith(elm.cloneNode(true)); + //elm.replaceWith(elm.cloneNode(true)); // issues: this remove all events also sorting }); this._getResetBtn().style.display = 'none'; @@ -1068,16 +1069,18 @@ class varienGridAdvanced { } resetColumnsOrder() { - new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { - method: 'post', - dataType: "json", - parameters: { - "gridId": this.containerId, - "reset": true - }, - onComplete: this.onReorderComplete.bind(this), - onSuccess: function(transport) {} - }, this); + if( confirm(this.resetConfirmText) ) { + new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { + method: 'post', + dataType: "json", + parameters: { + "gridId": this.containerId, + "reset": true + }, + onComplete: this.onReorderComplete.bind(this), + onSuccess: function(transport) {} + }, this); + } } onDragEnd(e) { From 92a4986525334a91ef663afaa9b5100fc0f0e425 Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 16 Sep 2023 13:42:13 +0200 Subject: [PATCH 68/92] phpcs --- .../core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php index 09f4c1b17f5..b6a3aee7762 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php @@ -84,7 +84,7 @@ public function getJavaScript(): string $this->getGridJsObjectName(), $this->getUrl('adminhtml/grid/saveColumnOrder') ); - $_content.="{$this->getJsObjectName()}.resetConfirmText = '{$this->getResetConfirmText()}';"; + $_content .= "{$this->getJsObjectName()}.resetConfirmText = '{$this->getResetConfirmText()}';"; return $_content; } From 00fed975002ca398a0413ce71e604d3cdbacca6b Mon Sep 17 00:00:00 2001 From: Tony Date: Sat, 16 Sep 2023 14:49:33 +0200 Subject: [PATCH 69/92] fix css --- js/mage/adminhtml/grid.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index c1bf7c1106b..b8b9173086f 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -945,7 +945,7 @@ class varienGridAdvanced { elm.addEventListener('dragend', this.onDragEnd.bind(this), false); this._wrap(elm); }); - this._getResetBtn().style.display = 'inherit'; + this._getResetBtn().style.display = 'initial'; this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); this._getToggleBtn().addEventListener('click', this.disableColumnsOrder.bind(this), false); From 67f88e3a736998627a436f39ac9022e1c66a1cb8 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 08:31:09 +0200 Subject: [PATCH 70/92] fix multigrid column sorting --- .../core/Mage/Adminhtml/Block/Widget/Grid.php | 6 +- js/mage/adminhtml/grid.js | 491 +++++++++--------- 2 files changed, 247 insertions(+), 250 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 90014445460..3e0ed366190 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -688,18 +688,16 @@ protected function _prepareAdvancedGridBlock() 'toggle_columns_order_button', $this->getLayout()->createBlock('adminhtml/widget_button') ->setData([ - 'id' => 'toggle_columns_order_button', + 'class' => 'toggle_columns_order_button', 'label' => Mage::helper('adminhtml')->__('Sort Columns'), - //'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.enableColumnsOrder(this)', ]) ); $this->setChild( 'reset_columns_order_button', $this->getLayout()->createBlock('adminhtml/widget_button') ->setData([ - 'id' => 'reset_columns_order_button', 'label' => Mage::helper('adminhtml')->__('Reset Columns Order'), - 'class' => 'delete', + 'class' => 'reset_columns_order_button delete', 'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.resetColumnsOrder()', ]) ); diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index b8b9173086f..2193ac6fb35 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -904,291 +904,290 @@ serializerController.prototype = { }; class varienGridAdvanced { - _currentDragItem = ''; - _targetDragColumn = ''; - _currentColumnsOrder = []; - _enabled = false; - _columnOrderChanged = false; - oldCallbacks = {}; - _columnSelector = 'tr.headings th'; - _btnToggleSelector = 'toggle_columns_order_button'; - _btnResetSelector = 'reset_columns_order_button'; - resetConfirmText = 'Are you sure?' - - constructor(containerId, grid, url) { - this.containerId = containerId; - this.grid = grid; - this.url = url; - - this.setOldCallback('init', grid.initCallback); - this.grid.initCallback = this.onGridInit.bind(this); - this.initReorderColumns(); - } - - initReorderColumns() { - if (this._enabled) { - this.enableColumnsOrder() - } else { - this.disableColumnsOrder(); - } - this._saveCurrentColumnsOrder(); - } - - enableColumnsOrder() { - this.getColumns().forEach((elm) => { - elm.setAttribute('draggable', true); - elm.addEventListener('dragstart', this.onDragStart.bind(this), false); - elm.addEventListener('dragenter', this.onDragEnter.bind(this), false); - elm.addEventListener('dragover', this.onDragOver.bind(this), false); - //elm.addEventListener('dragleave', this.onDragLeave.bind(this), false); - elm.addEventListener('drop', this.onDrop.bind(this), false); - elm.addEventListener('dragend', this.onDragEnd.bind(this), false); - this._wrap(elm); - }); - this._getResetBtn().style.display = 'initial'; - - this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); - this._getToggleBtn().addEventListener('click', this.disableColumnsOrder.bind(this), false); + oldCallbacks = {}; + resetConfirmText = 'Are you sure?' - this._enabled = true; - } + enabled = false; + columnOrderChanged = false; - disableColumnsOrder() { - this.getColumns().forEach((elm) => { - elm.removeAttribute('draggable'); - this._unwrap(elm); - //elm.replaceWith(elm.cloneNode(true)); // issues: this remove all events also sorting - }); - this._getResetBtn().style.display = 'none'; - - this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); - this._getToggleBtn().addEventListener('click', this.enableColumnsOrder.bind(this), false); - - this._enabled = false; - } - - buildDragPreview(elm) { - const _columnIndex = elm.cellIndex + 1; - - const _tableColPReview = document.createElement('table'); - _tableColPReview.style.width = elm.getBoundingClientRect().width + 'px'; - - const _tHead = _tableColPReview.createTHead(); - - const trHeading = _tHead.insertRow(); - trHeading.classList.add('headings'); - trHeading.append(elm.clone(true)); - - const trFilter = _tHead.insertRow(); - trFilter.classList.add('filter'); - const _selectorFilterRows = 'thead tr.filter th:nth-child(' + _columnIndex + ')'; - Array.from(elm.closest('table').querySelectorAll( _selectorFilterRows )).forEach((row) => { - trFilter.appendChild(row.clone(true)); - }); - - const _tBody = _tableColPReview.createTBody(); - const _selectorRows = 'tbody td:nth-child(' + _columnIndex + ')'; - Array.from(elm.closest('table').querySelectorAll( _selectorRows )).forEach((row) => { - const tr = _tBody.insertRow(); - tr.appendChild(row.clone(true)); - }); - + _currentDragItem = ''; + _targetDragColumn = ''; + _currentColumnsOrder = []; - const previewGrid = document.createElement('div'); - previewGrid.classList.add('grid'); - previewGrid.classList.add('grid__dragPreview'); - previewGrid.style.width = elm.getBoundingClientRect().width + 'px'; - previewGrid.setAttribute('id', 'dragPreview_placeholder') - previewGrid.append(_tableColPReview); - console.log(_tableColPReview); - return previewGrid; - } - - onDragStart(e) { - const placeholder = this.buildDragPreview(e.target.closest(this._columnSelector)); - document.body.appendChild(placeholder); - e.dataTransfer.setDragImage(placeholder, 0, 0); + _columnSelector = 'tr.headings th'; + _btnToggleSelector = '.toggle_columns_order_button'; + _btnResetSelector = '.reset_columns_order_button'; - - e.dataTransfer.effectAllowed = "copyMove"; - e.dataTransfer.setData("text/plain", null); - this._currentDragItem = e.target.closest(this._columnSelector); - } + constructor(containerId, grid, url) { + this.containerId = containerId; + this.grid = grid; + this.url = url; - onDragOver(e) { - if (e.preventDefault) { - e.preventDefault(); - } - - if (e.stopPropagation) { - e.stopPropagation(); - } + this.setOldCallback('init', grid.initCallback); + this.grid.initCallback = this.onGridInit.bind(this); + this.initReorderColumns(); + } + + initReorderColumns() { + if (this.enabled) { + this.enableColumnsOrder(); + } else { + this.disableColumnsOrder(); } + this._saveCurrentColumnsOrder(); + } - onDragEnter(e) { - this._resetClassStyle(); + enableColumnsOrder() { + this.getColumns().forEach((elm) => { + elm.setAttribute('draggable', true); + elm.addEventListener('dragstart', this.onDragStart.bind(this), false); + elm.addEventListener('dragenter', this.onDragEnter.bind(this), false); + elm.addEventListener('dragover', this.onDragOver.bind(this), false); + elm.addEventListener('drop', this.onDrop.bind(this), false); + elm.addEventListener('dragend', this.onDragEnd.bind(this), false); + this._wrap(elm); + }); + this._getResetBtn().style.display = 'initial'; - // disable drop self - let _currentTargetColumn = e.target.closest(this._columnSelector); - if(this._isSameColumn(_currentTargetColumn)) { - this._targetDragColumn = null; - return false; - } + this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); + this._getToggleBtn().addEventListener('click', this.disableColumnsOrder.bind(this), false); - this._targetDragColumn = _currentTargetColumn; + this.enabled = true; + } - this._targetDragColumn.classList.add('overDrag'); - if (this._checkElementisBefore(this._currentDragItem, this._targetDragColumn)) { - this._targetDragColumn.classList.add('overDrag__left'); - }else{ - this._targetDragColumn.classList.add('overDrag__right'); - } - } + disableColumnsOrder() { + this.getColumns().forEach((elm) => { + elm.removeAttribute('draggable'); + this._unwrap(elm); + //elm.replaceWith(elm.cloneNode(true)); // issues: this remove all events also sorting + }); + this._getResetBtn().style.display = 'none'; - /* onDragLeave(e) { - this._resetClassStyle(); - } */ + this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); + this._getToggleBtn().addEventListener('click', this.enableColumnsOrder.bind(this), false); - onDrop(e) { - if (e.preventDefault) { - e.preventDefault(); - } - if (e.stopPropagation) { - e.stopPropagation(); - } + this.enabled = false; + } - if(this._targetDragColumn) { - if (this._checkElementisBefore(this._currentDragItem, this._targetDragColumn)) { - e.target.parentNode.closest('tr').insertBefore(this._currentDragItem, this._targetDragColumn); - } else { - e.target.parentNode.closest('tr').insertBefore(this._currentDragItem, this._targetDragColumn.nextSibling); - } - this._saveCurrentColumnsOrder(true); - } - return false; - } + buildDragPreview(elm) { + const _columnIndex = elm.cellIndex + 1; - resetColumnsOrder() { - if( confirm(this.resetConfirmText) ) { - new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { - method: 'post', - dataType: "json", - parameters: { - "gridId": this.containerId, - "reset": true - }, - onComplete: this.onReorderComplete.bind(this), - onSuccess: function(transport) {} - }, this); - } - } + const _tableColPReview = document.createElement('table'); + _tableColPReview.style.width = elm.getBoundingClientRect().width + 'px'; - onDragEnd(e) { - this._resetClassStyle(); - - document.getElementById('dragPreview_placeholder').remove(); - - if (this._columnOrderChanged) { - new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { - method: 'post', - dataType: "json", - parameters: { - "gridId": this.containerId, - "data": JSON.stringify(this._currentColumnsOrder) - }, - onComplete: this.onReorderComplete.bind(this), - onSuccess: function(transport) {} - }, this); - } + const _tHead = _tableColPReview.createTHead(); + + const trHeading = _tHead.insertRow(); + trHeading.classList.add('headings'); + trHeading.append(elm.clone(true)); + + const trFilter = _tHead.insertRow(); + trFilter.classList.add('filter'); + const _selectorFilterRows = 'thead tr.filter th:nth-child(' + _columnIndex + ')'; + Array.from(elm.closest('table').querySelectorAll( _selectorFilterRows )).forEach((row) => { + trFilter.appendChild(row.clone(true)); + }); + + const _tBody = _tableColPReview.createTBody(); + const _selectorRows = 'tbody td:nth-child(' + _columnIndex + ')'; + Array.from(elm.closest('table').querySelectorAll( _selectorRows )).forEach((row) => { + const tr = _tBody.insertRow(); + tr.appendChild(row.clone(true)); + }); + + const previewGrid = document.createElement('div'); + previewGrid.classList.add('grid'); + previewGrid.classList.add('grid__dragPreview'); + previewGrid.style.width = elm.getBoundingClientRect().width + 'px'; + previewGrid.setAttribute('id', 'dragPreview_placeholder'); + previewGrid.append(_tableColPReview); + + return previewGrid; + } + + onDragStart(e) { + const placeholder = this.buildDragPreview(e.target.closest(this._columnSelector)); + document.body.appendChild(placeholder); + e.dataTransfer.setDragImage(placeholder, 0, 0); + + e.dataTransfer.effectAllowed = "copyMove"; + e.dataTransfer.setData("text/plain", null); + this._currentDragItem = e.target.closest(this._columnSelector); + } + + onDragOver(e) { + if (e.preventDefault) { + e.preventDefault(); } - onReorderComplete(transport) { - this._columnOrderChanged = false; - this.grid.reload(); + if (e.stopPropagation) { + e.stopPropagation(); } + } + + onDragEnter(e) { + this._resetClassStyle(); - // ensure varienGrid events propagation - getOldCallback(callbackName) { - return this.oldCallbacks[callbackName] ? this.oldCallbacks[callbackName] : Prototype.emptyFunction; + // disable drop self + let _currentTargetColumn = e.target.closest(this._columnSelector); + if (this._isSameColumn(_currentTargetColumn)) { + this._targetDragColumn = null; + return false; } - setOldCallback(callbackName, callback) { - this.oldCallbacks[callbackName] = callback; + this._targetDragColumn = _currentTargetColumn; + + this._targetDragColumn.classList.add('overDrag'); + if (this._checkElementisBefore(this._currentDragItem, this._targetDragColumn)) { + this._targetDragColumn.classList.add('overDrag__left'); + } else { + this._targetDragColumn.classList.add('overDrag__right'); } + } - onGridInit(grid) { - console.log('inGridInit') - this.initReorderColumns(); - this.getOldCallback('init')(grid); + onDrop(e) { + if (e.preventDefault) { + e.preventDefault(); + } + if (e.stopPropagation) { + e.stopPropagation(); } - getColumns() { - /** - * Example: table#up_sell_product_grid_table > tr.headings > th - */ - let tableContainer = '#' + this.containerId + '_table'; - return Array.from(document.querySelectorAll(tableContainer + ' ' +this._columnSelector)); + if (this._targetDragColumn) { + if (this._checkElementisBefore(this._currentDragItem, this._targetDragColumn)) { + e.target.parentNode.closest('tr').insertBefore(this._currentDragItem, this._targetDragColumn); + } else { + e.target.parentNode.closest('tr').insertBefore(this._currentDragItem, this._targetDragColumn.nextSibling); + } + this._saveCurrentColumnsOrder(true); } + return false; + } - _getToggleBtn() { - return document.getElementById(this._btnToggleSelector); + resetColumnsOrder() { + if (confirm(this.resetConfirmText)) { + new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { + method: 'post', + dataType: "json", + parameters: { + "gridId": this.containerId, + "reset": true + }, + onComplete: this.onReorderComplete.bind(this), + onSuccess: function(transport) {} + }, this); } + } - _getResetBtn() { - return document.getElementById(this._btnResetSelector); + onDragEnd(e) { + this._resetClassStyle(); + + document.getElementById('dragPreview_placeholder').remove(); + + if (this.columnOrderChanged) { + new Ajax.Request(this.url + (this.url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { + method: 'post', + dataType: "json", + parameters: { + "gridId": this.containerId, + "data": JSON.stringify(this._currentColumnsOrder) + }, + onComplete: this.onReorderComplete.bind(this), + onSuccess: function(transport) {} + }, this); } + } - _saveCurrentColumnsOrder(orderChanged = false) { - this._currentColumnsOrder = []; - this.getColumns().forEach((elm) => { - this._currentColumnsOrder.push(elm.getAttribute('data-entity')); - }); - if(orderChanged != false) { - this._columnOrderChanged = true; - } - return this._currentColumnsOrder; + onReorderComplete(transport) { + this.columnOrderChanged = false; + this.grid.reload(); + } + + // ensure varienGrid events propagation + getOldCallback(callbackName) { + return this.oldCallbacks[callbackName] ? this.oldCallbacks[callbackName] : Prototype.emptyFunction; + } + + setOldCallback(callbackName, callback) { + this.oldCallbacks[callbackName] = callback; + } + + onGridInit(grid) { + this.initReorderColumns(); + this.getOldCallback('init')(grid); + } + + getColumns() { + return Array.from(this._getTableHTMLElement().querySelectorAll(this._columnSelector)); + } + + _getContainerHTMLElement() { + return document.getElementById(this.containerId); + } + + _getTableHTMLElement() { + return this._getContainerHTMLElement().querySelector('#' + this.containerId + '_table'); + } + + _getToggleBtn() { + return this._getContainerHTMLElement().querySelector(this._btnToggleSelector); + } + + _getResetBtn() { + return this._getContainerHTMLElement().querySelector(this._btnResetSelector); + } + + _saveCurrentColumnsOrder(orderChanged = false) { + this._currentColumnsOrder = []; + this.getColumns().forEach((elm) => { + this._currentColumnsOrder.push(elm.getAttribute('data-entity')); + }); + if (orderChanged != false) { + this.columnOrderChanged = true; } - - _checkElementisBefore(el1, el2) { - if (el2.parentNode === el1.parentNode) { - for (var cur = el1.previousSibling; cur && cur.nodeType !== 9; cur = cur.previousSibling) { - if (cur === el2) { - return true; - } + return this._currentColumnsOrder; + } + + _checkElementisBefore(el1, el2) { + if (el2.parentNode === el1.parentNode) { + for (var cur = el1.previousSibling; cur && cur.nodeType !== 9; cur = cur.previousSibling) { + if (cur === el2) { + return true; } } - return false; } + return false; + } - _isSameColumn(element) { - if (this._currentDragItem == element) { - return true; - } - return false; + _isSameColumn(element) { + if (this._currentDragItem == element) { + return true; } + return false; + } - _resetClassStyle() { - this.getColumns().forEach((elm) => { - elm.classList.remove('overDrag'); - elm.classList.remove('overDrag__left'); - elm.classList.remove('overDrag__right'); - }); - } + _resetClassStyle() { + this.getColumns().forEach((elm) => { + elm.classList.remove('overDrag'); + elm.classList.remove('overDrag__left'); + elm.classList.remove('overDrag__right'); + }); + } - _wrap(target) { - if (!target.querySelector('.draggable')) { - let wrapper = document.createElement('span'); - wrapper.classList.add('draggable'); - [ ...target.childNodes ].forEach(child => wrapper.appendChild(child)); - target.appendChild(wrapper); - return wrapper; - } + _wrap(target) { + if (!target.querySelector('.draggable')) { + let wrapper = document.createElement('span'); + wrapper.classList.add('draggable'); + [ ...target.childNodes ].forEach(child => wrapper.appendChild(child)); + target.appendChild(wrapper); + return wrapper; } + } - _unwrap(target) { - let wrapper = target.querySelector('.draggable'); - if (wrapper) { - target.querySelector('.draggable').replaceWith(...target.querySelector('.draggable').childNodes); - } + _unwrap(target) { + let wrapper = target.querySelector('.draggable'); + if (wrapper) { + target.querySelector('.draggable').replaceWith(...target.querySelector('.draggable').childNodes); } - } \ No newline at end of file + } +} \ No newline at end of file From d09daa115466754a8e2cf14d420907413728ae50 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 08:39:40 +0200 Subject: [PATCH 71/92] better style drag icon --- skin/adminhtml/default/default/boxes.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index 9c707b3bb2f..afeb97fb8ba 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -231,8 +231,8 @@ tr.dynamic-grid input.input-text { width:154px; } .grid tr.headings th[draggable] span.draggable { display: flex; gap: 8px; align-items: center; } .grid tr.headings th[draggable] span.draggable:before { content: url('data:image/svg+xml,'); - width: 12px; - height: 12px; + height: 14px; + aspect-ratio: 1; } /* ACCORDION From 7f2904eb28ce7692d9cde3cb56b1082ffb5703ab Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 10:38:20 +0200 Subject: [PATCH 72/92] refactor better double-scroll --- js/mage/adminhtml/grid-double-scroll.js | 105 +++++++++++++----------- 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/js/mage/adminhtml/grid-double-scroll.js b/js/mage/adminhtml/grid-double-scroll.js index 0d212711c44..e2238dd8a58 100644 --- a/js/mage/adminhtml/grid-double-scroll.js +++ b/js/mage/adminhtml/grid-double-scroll.js @@ -1,53 +1,66 @@ -window.addEventListener('DOMContentLoaded', function() { - function DoubleScroll(element) { - if(!element.getAttribute('data-doublescroll')){ - var scrollbar= document.createElement('div'); - scrollbar.appendChild(document.createElement('div')); - scrollbar.style.overflow= 'auto'; - scrollbar.style.overflowY= 'hidden'; - scrollbar.firstChild.style.width= element.scrollWidth+'px'; - scrollbar.firstChild.style.height= '0'; - scrollbar.firstChild.style.paddingTop= '1px'; - scrollbar.firstChild.appendChild(document.createTextNode('\xA0')); - var running = false; - scrollbar.onscroll= function() { - if(running) { - running = false; - return; - } - running = true; - element.scrollLeft= scrollbar.scrollLeft; - }; - element.onscroll= function() { - if(running) { - running = false; - return; - } - running = true; - scrollbar.scrollLeft= element.scrollLeft; - }; - element.parentNode.insertBefore(scrollbar, element); - element.setAttribute('data-doublescroll', 1); +class gridDoubleScroll { + + _scrolling = false; + + constructor(wrapperScrollBar) { + this.init(wrapperScrollBar); + } + + init(wrapperScrollBar) { + this.wrapperScrollBar = wrapperScrollBar; + let scrollbarTop = this.wrapperScrollBar.parentNode.querySelector('.hor-scroll-top'); + if (!scrollbarTop){ + this.createDoubleScroll(this.wrapperScrollBar); + this.scrollbarTop.addEventListener('scroll', this.syncWrapperScrollBar.bind(this), false); + this.wrapperScrollBar.addEventListener('scroll', this.syncScrollBarTop.bind(this), false); + const observer = new MutationObserver( this.updateDoubleScrollWidth.bind(this) ); + observer.observe(this.wrapperScrollBar, { childList: true, subtree: true }); } + this.updateDoubleScrollWidth(); } - var horscrolls = document.querySelectorAll('.hor-scroll'); - for (horscroll of horscrolls) { - DoubleScroll(horscroll); + + createDoubleScroll() { + let scrollbarTop = document.createElement('div'); + scrollbarTop.classList.add('hor-scroll-top'); + scrollbarTop.appendChild(document.createElement('div')); + scrollbarTop.style.overflow = 'auto'; + scrollbarTop.style.overflowY = 'hidden'; + //scrollbarTop.firstChild.style.height = '0'; + scrollbarTop.firstChild.style.paddingTop = '1px'; + scrollbarTop.firstChild.appendChild(document.createTextNode('\xA0')); + this.wrapperScrollBar.parentNode.insertBefore(scrollbarTop, this.wrapperScrollBar); + + this.scrollbarTop = scrollbarTop; } - const config = { childList: true }; - const callback = function(mutationsList, observer) { - var horscrolls = document.querySelectorAll('.hor-scroll'); - for (horscroll of horscrolls) { - DoubleScroll(horscroll); + + syncWrapperScrollBar() { + if(this._scrolling) { + this._scrolling = false; + return; } - }; - const observer = new MutationObserver(callback); - const productGridNode = document.getElementById('productGrid'); - if(productGridNode){ - observer.observe(productGridNode, config); + this._scrolling = true; + this.wrapperScrollBar.scrollLeft = this.scrollbarTop.scrollLeft; } - const salesOrderGridNode = document.getElementById('sales_order_grid'); - if(salesOrderGridNode){ - observer.observe(salesOrderGridNode, config); + + syncScrollBarTop() { + if(this._scrolling) { + this._scrolling = false; + return; + } + this._scrolling = true; + this.scrollbarTop.scrollLeft = this.wrapperScrollBar.scrollLeft; + }; + + updateDoubleScrollWidth() { + if (this.scrollbarTop.firstChild.style.width != this.wrapperScrollBar.scrollWidth) { + this.scrollbarTop.firstChild.style.width = this.wrapperScrollBar.scrollWidth + 'px'; + } } +}; + +window.addEventListener('DOMContentLoaded', function() { + let horScrolls = document.querySelectorAll('.hor-scroll'); + horScrolls.forEach( (horScroll) => { + new gridDoubleScroll(horScroll); + }); }); From 99c34b3db121f6c748d182e206cf8b4a983a396b Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 10:39:07 +0200 Subject: [PATCH 73/92] copyright --- js/mage/adminhtml/grid-double-scroll.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/js/mage/adminhtml/grid-double-scroll.js b/js/mage/adminhtml/grid-double-scroll.js index e2238dd8a58..c3162d57ddd 100644 --- a/js/mage/adminhtml/grid-double-scroll.js +++ b/js/mage/adminhtml/grid-double-scroll.js @@ -1,3 +1,16 @@ +/** + * OpenMage + * + * This source file is subject to the Academic Free License (AFL 3.0) + * that is bundled with this package in the file LICENSE_AFL.txt. + * It is also available at https://opensource.org/license/afl-3-0-php + * + * @category Mage + * @package Mage_Adminhtml + * @copyright Copyright (c) 2019-2023 The OpenMage Contributors (https://www.openmage.org) + * @license https://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) + */ + class gridDoubleScroll { _scrolling = false; From 489bdc0c0e5ab64cdb8f2c7bcbf9451e5e258b76 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 11:01:27 +0200 Subject: [PATCH 74/92] bettere grid double-scroll handling --- .../default/template/widget/grid.phtml | 2 + js/mage/adminhtml/grid-double-scroll.js | 54 ++++++++++++------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/app/design/adminhtml/default/default/template/widget/grid.phtml b/app/design/adminhtml/default/default/template/widget/grid.phtml index 2c189ca567f..90886dd2d10 100644 --- a/app/design/adminhtml/default/default/template/widget/grid.phtml +++ b/app/design/adminhtml/default/default/template/widget/grid.phtml @@ -217,6 +217,8 @@ $numColumns = count($this->getColumns()); getAdvancedGridBlock()->getJavaScript() ?> getAdditionalJavaScript(); ?> + + new gridDoubleScroll('getId() ?>', getJsObjectName() ?>); //]]> diff --git a/js/mage/adminhtml/grid-double-scroll.js b/js/mage/adminhtml/grid-double-scroll.js index c3162d57ddd..3330ab16153 100644 --- a/js/mage/adminhtml/grid-double-scroll.js +++ b/js/mage/adminhtml/grid-double-scroll.js @@ -12,24 +12,45 @@ */ class gridDoubleScroll { - + oldCallbacks = {}; _scrolling = false; - constructor(wrapperScrollBar) { - this.init(wrapperScrollBar); + constructor(containerId, grid) { + this.containerId = containerId; + this.grid = grid; + this.setOldCallback('init', grid.initCallback); + this.grid.initCallback = this.onGridInit.bind(this); + + this.initDoubleScroll(); } - init(wrapperScrollBar) { - this.wrapperScrollBar = wrapperScrollBar; - let scrollbarTop = this.wrapperScrollBar.parentNode.querySelector('.hor-scroll-top'); - if (!scrollbarTop){ - this.createDoubleScroll(this.wrapperScrollBar); - this.scrollbarTop.addEventListener('scroll', this.syncWrapperScrollBar.bind(this), false); - this.wrapperScrollBar.addEventListener('scroll', this.syncScrollBarTop.bind(this), false); - const observer = new MutationObserver( this.updateDoubleScrollWidth.bind(this) ); - observer.observe(this.wrapperScrollBar, { childList: true, subtree: true }); + initDoubleScroll() { + this.wrapperScrollBar = document.getElementById(this.containerId).querySelector('.hor-scroll'); + if (this.wrapperScrollBar) { + let scrollbarTop = this.wrapperScrollBar.parentNode.querySelector('.hor-scroll-top'); + if (!scrollbarTop){ + this.createDoubleScroll(this.wrapperScrollBar); + this.scrollbarTop.addEventListener('scroll', this.syncWrapperScrollBar.bind(this), false); + this.wrapperScrollBar.addEventListener('scroll', this.syncScrollBarTop.bind(this), false); + const observer = new MutationObserver( this.updateDoubleScrollWidth.bind(this) ); + observer.observe(this.wrapperScrollBar, { childList: true, subtree: true }); + } + this.updateDoubleScrollWidth(); } - this.updateDoubleScrollWidth(); + } + + // ensure varienGrid events propagation + getOldCallback(callbackName) { + return this.oldCallbacks[callbackName] ? this.oldCallbacks[callbackName] : Prototype.emptyFunction; + } + + setOldCallback(callbackName, callback) { + this.oldCallbacks[callbackName] = callback; + } + + onGridInit(grid) { + this.initDoubleScroll(); + this.getOldCallback('init')(grid); } createDoubleScroll() { @@ -70,10 +91,3 @@ class gridDoubleScroll { } } }; - -window.addEventListener('DOMContentLoaded', function() { - let horScrolls = document.querySelectorAll('.hor-scroll'); - horScrolls.forEach( (horScroll) => { - new gridDoubleScroll(horScroll); - }); -}); From 0884ef3eb420f0f7f1e38662085eeea7dd6b06c6 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 11:04:35 +0200 Subject: [PATCH 75/92] fix scrollbar top height in legacy theme --- js/mage/adminhtml/grid-double-scroll.js | 2 +- skin/adminhtml/default/default/boxes.css | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/js/mage/adminhtml/grid-double-scroll.js b/js/mage/adminhtml/grid-double-scroll.js index 3330ab16153..357bcda70ac 100644 --- a/js/mage/adminhtml/grid-double-scroll.js +++ b/js/mage/adminhtml/grid-double-scroll.js @@ -59,7 +59,7 @@ class gridDoubleScroll { scrollbarTop.appendChild(document.createElement('div')); scrollbarTop.style.overflow = 'auto'; scrollbarTop.style.overflowY = 'hidden'; - //scrollbarTop.firstChild.style.height = '0'; + scrollbarTop.firstChild.style.height = '0'; scrollbarTop.firstChild.style.paddingTop = '1px'; scrollbarTop.firstChild.appendChild(document.createTextNode('\xA0')); this.wrapperScrollBar.parentNode.insertBefore(scrollbarTop, this.wrapperScrollBar); diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index afeb97fb8ba..7c8d72fec7f 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -222,10 +222,10 @@ tr.dynamic-grid input.input-text { width:154px; } /* Grid heading drag&drop */ .overDrag { background-color: rgba(255, 255, 255, 0.60) !important; } -.overDrag:after { content: '▲'; position: absolute; overflow: hidden; color: red; z-index: 99999999999999; font-weight: bold; font-size: 18px; } +.overDrag:after { content: '▲'; position: absolute; overflow: hidden; color: #a92000; z-index: 99999999999999; font-weight: bold; font-size: 18px; } .overDrag__left::after { left: -10px; } .overDrag__right::after { right: -10px; } -.grid__dragPreview { border: 1px solid red; } +.grid__dragPreview { border: 1px solid #a92000; } .grid tr.headings th[draggable], .grid tr.headings th[draggable] a { cursor: move; position: relative; } .grid tr.headings th[draggable] span.draggable { display: flex; gap: 8px; align-items: center; } From 5c0b21e32ed17a98d51472b5f610819beaf51be0 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 11:09:27 +0200 Subject: [PATCH 76/92] draggable css fix icon sorting --- skin/adminhtml/default/default/boxes.css | 1 + 1 file changed, 1 insertion(+) diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index 7c8d72fec7f..78783bd520a 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -229,6 +229,7 @@ tr.dynamic-grid input.input-text { width:154px; } .grid tr.headings th[draggable], .grid tr.headings th[draggable] a { cursor: move; position: relative; } .grid tr.headings th[draggable] span.draggable { display: flex; gap: 8px; align-items: center; } +.grid tr.headings th[draggable] span.draggable > * { flex-grow: 1; } .grid tr.headings th[draggable] span.draggable:before { content: url('data:image/svg+xml,'); height: 14px; From bd1fcdf6ba18aec044feae7d0df8a58ced58f439 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 11:44:03 +0200 Subject: [PATCH 77/92] fix add remove events --- js/mage/adminhtml/grid.js | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index 2193ac6fb35..473d0224340 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -925,6 +925,15 @@ class varienGridAdvanced { this.setOldCallback('init', grid.initCallback); this.grid.initCallback = this.onGridInit.bind(this); + + this.handlerOnDragStart = this.onDragStart.bind(this); + this.handlerOnDragEnter = this.onDragEnter.bind(this); + this.handlerOnDragOver = this.onDragOver.bind(this); + this.handlerOnDrop = this.onDrop.bind(this); + this.handlerOnDragEnd = this.onDragEnd.bind(this); + this.handlerEnableColumnsOrder = this.enableColumnsOrder.bind(this); + this.handlerDisableColumnsOrder = this.disableColumnsOrder.bind(this); + this.initReorderColumns(); } @@ -940,17 +949,18 @@ class varienGridAdvanced { enableColumnsOrder() { this.getColumns().forEach((elm) => { elm.setAttribute('draggable', true); - elm.addEventListener('dragstart', this.onDragStart.bind(this), false); - elm.addEventListener('dragenter', this.onDragEnter.bind(this), false); - elm.addEventListener('dragover', this.onDragOver.bind(this), false); - elm.addEventListener('drop', this.onDrop.bind(this), false); - elm.addEventListener('dragend', this.onDragEnd.bind(this), false); this._wrap(elm); + elm.addEventListener('dragstart', this.handlerOnDragStart, false); + elm.addEventListener('dragenter', this.handlerOnDragEnter, false); + elm.addEventListener('dragover', this.handlerOnDragOver, false); + elm.addEventListener('drop', this.handlerOnDrop, false); + elm.addEventListener('dragend', this.handlerOnDragEnd, false); }); this._getResetBtn().style.display = 'initial'; - this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); - this._getToggleBtn().addEventListener('click', this.disableColumnsOrder.bind(this), false); + + this._getToggleBtn().removeEventListener('click', this.handlerEnableColumnsOrder, false); + this._getToggleBtn().addEventListener('click', this.handlerDisableColumnsOrder, false); this.enabled = true; } @@ -959,12 +969,16 @@ class varienGridAdvanced { this.getColumns().forEach((elm) => { elm.removeAttribute('draggable'); this._unwrap(elm); - //elm.replaceWith(elm.cloneNode(true)); // issues: this remove all events also sorting + elm.removeEventListener('dragstart', this.handlerOnDragStart, false); + elm.removeEventListener('dragenter', this.handlerOnDragEnter, false); + elm.removeEventListener('dragover', this.handlerOnDragOver, false); + elm.removeEventListener('drop', this.handlerOnDrop, false); + elm.removeEventListener('dragend', this.handlerOnDragEnd, false); }); this._getResetBtn().style.display = 'none'; - this._getToggleBtn().replaceWith(this._getToggleBtn().cloneNode(true)); - this._getToggleBtn().addEventListener('click', this.enableColumnsOrder.bind(this), false); + this._getToggleBtn().removeEventListener('click', this.handlerDisableColumnsOrder, false); + this._getToggleBtn().addEventListener('click', this.handlerEnableColumnsOrder, false); this.enabled = false; } From 2b0ce61285168e5f91e1740b1ce473111eb40faf Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 17 Sep 2023 11:54:15 +0200 Subject: [PATCH 78/92] cosmetic --- js/mage/adminhtml/grid-double-scroll.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/js/mage/adminhtml/grid-double-scroll.js b/js/mage/adminhtml/grid-double-scroll.js index 357bcda70ac..cce4f4356fd 100644 --- a/js/mage/adminhtml/grid-double-scroll.js +++ b/js/mage/adminhtml/grid-double-scroll.js @@ -20,6 +20,10 @@ class gridDoubleScroll { this.grid = grid; this.setOldCallback('init', grid.initCallback); this.grid.initCallback = this.onGridInit.bind(this); + + this.handlerSyncWrapperScrollBar = this.syncWrapperScrollBar.bind(this); + this.handlerSyncScrollBarTop = this.syncScrollBarTop.bind(this); + this.handlerUpdateDoubleScrollWidth = this.updateDoubleScrollWidth.bind(this); this.initDoubleScroll(); } @@ -30,9 +34,9 @@ class gridDoubleScroll { let scrollbarTop = this.wrapperScrollBar.parentNode.querySelector('.hor-scroll-top'); if (!scrollbarTop){ this.createDoubleScroll(this.wrapperScrollBar); - this.scrollbarTop.addEventListener('scroll', this.syncWrapperScrollBar.bind(this), false); - this.wrapperScrollBar.addEventListener('scroll', this.syncScrollBarTop.bind(this), false); - const observer = new MutationObserver( this.updateDoubleScrollWidth.bind(this) ); + this.scrollbarTop.addEventListener('scroll', this.handlerSyncWrapperScrollBar, false); + this.wrapperScrollBar.addEventListener('scroll', this.handlerSyncScrollBarTop, false); + const observer = new MutationObserver( this.handlerUpdateDoubleScrollWidth ); observer.observe(this.wrapperScrollBar, { childList: true, subtree: true }); } this.updateDoubleScrollWidth(); From 3a4ab138c9afa8a9180a74fc81235e68d8b66b0c Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Sun, 17 Sep 2023 22:47:43 +0100 Subject: [PATCH 79/92] Renamed a couple of things --- .../core/Mage/Adminhtml/Block/Widget/Grid.php | 10 +++++----- app/locale/en_US/Mage_Adminhtml.csv | 1 + js/mage/adminhtml/grid.js | 19 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 3e0ed366190..36147a6ac72 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -688,17 +688,17 @@ protected function _prepareAdvancedGridBlock() 'toggle_columns_order_button', $this->getLayout()->createBlock('adminhtml/widget_button') ->setData([ - 'class' => 'toggle_columns_order_button', - 'label' => Mage::helper('adminhtml')->__('Sort Columns'), + 'class' => 'toggle_columns_order_button', + 'label' => Mage::helper('adminhtml')->__('Rearrange Columns'), ]) ); $this->setChild( 'reset_columns_order_button', $this->getLayout()->createBlock('adminhtml/widget_button') ->setData([ - 'label' => Mage::helper('adminhtml')->__('Reset Columns Order'), - 'class' => 'reset_columns_order_button delete', - 'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.resetColumnsOrder()', + 'label' => Mage::helper('adminhtml')->__('Reset Columns Order'), + 'class' => 'reset_columns_order_button delete', + 'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.resetColumnsOrder()', ]) ); } diff --git a/app/locale/en_US/Mage_Adminhtml.csv b/app/locale/en_US/Mage_Adminhtml.csv index 645ad4bc15d..d1221c7c4cd 100644 --- a/app/locale/en_US/Mage_Adminhtml.csv +++ b/app/locale/en_US/Mage_Adminhtml.csv @@ -852,6 +852,7 @@ "Radio Buttons","Radio Buttons" "Rates","Rates" "Read details","Read details" +"Rearrange Columns","Rearrange Columns" "Rebuild","Rebuild" "Rebuild Catalog Index","Rebuild Catalog Index" "Rebuild Flat Catalog Category","Rebuild Flat Catalog Category" diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index 473d0224340..e94d04f274e 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -931,22 +931,22 @@ class varienGridAdvanced { this.handlerOnDragOver = this.onDragOver.bind(this); this.handlerOnDrop = this.onDrop.bind(this); this.handlerOnDragEnd = this.onDragEnd.bind(this); - this.handlerEnableColumnsOrder = this.enableColumnsOrder.bind(this); - this.handlerDisableColumnsOrder = this.disableColumnsOrder.bind(this); + this.handlerEnableColumnsOrder = this.enableColumnsRearrangement.bind(this); + this.handlerDisableColumnsOrder = this.disableColumnsRearrangement.bind(this); - this.initReorderColumns(); + this.initColumnsRearrangement(); } - initReorderColumns() { + initColumnsRearrangement() { if (this.enabled) { - this.enableColumnsOrder(); + this.enableColumnsRearrangement(); } else { - this.disableColumnsOrder(); + this.disableColumnsRearrangement(); } this._saveCurrentColumnsOrder(); } - enableColumnsOrder() { + enableColumnsRearrangement() { this.getColumns().forEach((elm) => { elm.setAttribute('draggable', true); this._wrap(elm); @@ -958,14 +958,13 @@ class varienGridAdvanced { }); this._getResetBtn().style.display = 'initial'; - this._getToggleBtn().removeEventListener('click', this.handlerEnableColumnsOrder, false); this._getToggleBtn().addEventListener('click', this.handlerDisableColumnsOrder, false); this.enabled = true; } - disableColumnsOrder() { + disableColumnsRearrangement() { this.getColumns().forEach((elm) => { elm.removeAttribute('draggable'); this._unwrap(elm); @@ -1127,7 +1126,7 @@ class varienGridAdvanced { } onGridInit(grid) { - this.initReorderColumns(); + this.initColumnsRearrangement(); this.getOldCallback('init')(grid); } From a48c1e6abe65a8ae63965cf8ba906b2a24ade7ee Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Sun, 17 Sep 2023 22:59:50 +0100 Subject: [PATCH 80/92] Fixed todo with uksort --- app/code/core/Mage/Adminhtml/Block/Widget/Grid.php | 7 ++++--- skin/adminhtml/default/default/boxes.css | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 36147a6ac72..813f7eb2cd3 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -767,11 +767,12 @@ protected function _prepareAdvancedGridColumn() if ($_orderColumns) { // Reset Column Order $this->_columnsOrder = []; - // TODO Deprecated functionality: uksort(): Returning bool from comparison function is deprecated, return an integer less than, equal to, or greater than zero - @uksort($this->_columns, function ($a, $b) use ($_orderColumns) { + uksort($this->_columns, function ($a, $b) use ($_orderColumns) { $posA = array_search($a, $_orderColumns); $posB = array_search($b, $_orderColumns); - return $posA > $posB; + if ($posA > $posB) return 1; + if ($posA < $posB) return -1; + return 0; }); } else { $this->sortColumnsByOrder(); diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index 78783bd520a..3ac324cd54d 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -222,9 +222,9 @@ tr.dynamic-grid input.input-text { width:154px; } /* Grid heading drag&drop */ .overDrag { background-color: rgba(255, 255, 255, 0.60) !important; } -.overDrag:after { content: '▲'; position: absolute; overflow: hidden; color: #a92000; z-index: 99999999999999; font-weight: bold; font-size: 18px; } -.overDrag__left::after { left: -10px; } -.overDrag__right::after { right: -10px; } +.overDrag:after { content: '▼'; position: absolute; color: #a92000; z-index: 999999999999999999999; font-weight: bold; font-size: 18px; overflow: visible } +.overDrag__left::after { top: -15px; left: -10px; } +.overDrag__right::after { top: -15px; right: -10px; } .grid__dragPreview { border: 1px solid #a92000; } .grid tr.headings th[draggable], .grid tr.headings th[draggable] a { cursor: move; position: relative; } From 699584ab3c4ba164bef6c5730e1d475dc6d1b6ce Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Sun, 17 Sep 2023 23:16:16 +0100 Subject: [PATCH 81/92] Column indicator moved above the colum for better readability --- js/mage/adminhtml/grid.js | 4 +++- skin/adminhtml/default/default/boxes.css | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index e94d04f274e..aea0f9949ef 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -905,7 +905,7 @@ serializerController.prototype = { class varienGridAdvanced { oldCallbacks = {}; - resetConfirmText = 'Are you sure?' + resetConfirmText = Translator.translate('Are you sure?'); enabled = false; columnOrderChanged = false; @@ -947,6 +947,7 @@ class varienGridAdvanced { } enableColumnsRearrangement() { + document.getElementById(this.grid.containerId + '_table').setAttribute('style', 'margin-top: 10px'); this.getColumns().forEach((elm) => { elm.setAttribute('draggable', true); this._wrap(elm); @@ -965,6 +966,7 @@ class varienGridAdvanced { } disableColumnsRearrangement() { + document.getElementById(this.grid.containerId + '_table').setAttribute('style', ''); this.getColumns().forEach((elm) => { elm.removeAttribute('draggable'); this._unwrap(elm); diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index 3ac324cd54d..97484bd0931 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -222,9 +222,9 @@ tr.dynamic-grid input.input-text { width:154px; } /* Grid heading drag&drop */ .overDrag { background-color: rgba(255, 255, 255, 0.60) !important; } -.overDrag:after { content: '▼'; position: absolute; color: #a92000; z-index: 999999999999999999999; font-weight: bold; font-size: 18px; overflow: visible } -.overDrag__left::after { top: -15px; left: -10px; } -.overDrag__right::after { top: -15px; right: -10px; } +.overDrag:after { content: '▼'; position: absolute; color: #a92000; z-index: 999999999999999; font-weight: bold; font-size: 18px; top: -15px; overflow: visible } +.overDrag__left::after { left: -10px; } +.overDrag__right::after { right: -10px; } .grid__dragPreview { border: 1px solid #a92000; } .grid tr.headings th[draggable], .grid tr.headings th[draggable] a { cursor: move; position: relative; } From 4bae58fcea3e3c51427970dc543c57f60082294c Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Sun, 17 Sep 2023 23:25:55 +0100 Subject: [PATCH 82/92] phpcs --- app/code/core/Mage/Adminhtml/Block/Widget/Grid.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 813f7eb2cd3..bde520da6cf 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -770,8 +770,12 @@ protected function _prepareAdvancedGridColumn() uksort($this->_columns, function ($a, $b) use ($_orderColumns) { $posA = array_search($a, $_orderColumns); $posB = array_search($b, $_orderColumns); - if ($posA > $posB) return 1; - if ($posA < $posB) return -1; + if ($posA > $posB) { + return 1; + } + if ($posA < $posB) { + return -1; + } return 0; }); } else { From 3da6df62f1258f650616cb1076882340fb1a5f87 Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 18 Sep 2023 09:52:26 +0200 Subject: [PATCH 83/92] use class no-display --- js/mage/adminhtml/grid.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index aea0f9949ef..69e583196d7 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -957,7 +957,7 @@ class varienGridAdvanced { elm.addEventListener('drop', this.handlerOnDrop, false); elm.addEventListener('dragend', this.handlerOnDragEnd, false); }); - this._getResetBtn().style.display = 'initial'; + this._getResetBtn().classList.remove('no-display'); this._getToggleBtn().removeEventListener('click', this.handlerEnableColumnsOrder, false); this._getToggleBtn().addEventListener('click', this.handlerDisableColumnsOrder, false); @@ -976,7 +976,7 @@ class varienGridAdvanced { elm.removeEventListener('drop', this.handlerOnDrop, false); elm.removeEventListener('dragend', this.handlerOnDragEnd, false); }); - this._getResetBtn().style.display = 'none'; + this._getResetBtn().classList.add('no-display'); this._getToggleBtn().removeEventListener('click', this.handlerDisableColumnsOrder, false); this._getToggleBtn().addEventListener('click', this.handlerEnableColumnsOrder, false); From 974b792e56ae02ffd1f45e9bdd170ec0aa50d8fa Mon Sep 17 00:00:00 2001 From: Tony Date: Mon, 18 Sep 2023 17:04:50 +0200 Subject: [PATCH 84/92] fix multi-grid reset button handler --- app/code/core/Mage/Adminhtml/Block/Widget/Grid.php | 1 - js/mage/adminhtml/grid.js | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index bde520da6cf..90ad401f8d0 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -698,7 +698,6 @@ protected function _prepareAdvancedGridBlock() ->setData([ 'label' => Mage::helper('adminhtml')->__('Reset Columns Order'), 'class' => 'reset_columns_order_button delete', - 'onclick' => $this->getAdvancedGridBlock()->getJsObjectName() . '.resetColumnsOrder()', ]) ); } diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index 69e583196d7..dc605902f7e 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -933,6 +933,7 @@ class varienGridAdvanced { this.handlerOnDragEnd = this.onDragEnd.bind(this); this.handlerEnableColumnsOrder = this.enableColumnsRearrangement.bind(this); this.handlerDisableColumnsOrder = this.disableColumnsRearrangement.bind(this); + this.handlerResetColumnsOrder = this.resetColumnsOrder.bind(this); this.initColumnsRearrangement(); } @@ -957,6 +958,7 @@ class varienGridAdvanced { elm.addEventListener('drop', this.handlerOnDrop, false); elm.addEventListener('dragend', this.handlerOnDragEnd, false); }); + this._getResetBtn().addEventListener('click', this.handlerResetColumnsOrder, false); this._getResetBtn().classList.remove('no-display'); this._getToggleBtn().removeEventListener('click', this.handlerEnableColumnsOrder, false); @@ -976,6 +978,7 @@ class varienGridAdvanced { elm.removeEventListener('drop', this.handlerOnDrop, false); elm.removeEventListener('dragend', this.handlerOnDragEnd, false); }); + this._getResetBtn().removeEventListener('click', this.handlerResetColumnsOrder, false); this._getResetBtn().classList.add('no-display'); this._getToggleBtn().removeEventListener('click', this.handlerDisableColumnsOrder, false); From 854e4d2e19b45322cd4f3db225d93566c498f849 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Mon, 18 Sep 2023 19:52:16 +0100 Subject: [PATCH 85/92] Removed margin and switched arrow style --- js/mage/adminhtml/grid.js | 2 -- skin/adminhtml/default/default/boxes.css | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/js/mage/adminhtml/grid.js b/js/mage/adminhtml/grid.js index dc605902f7e..f58a97f947d 100644 --- a/js/mage/adminhtml/grid.js +++ b/js/mage/adminhtml/grid.js @@ -948,7 +948,6 @@ class varienGridAdvanced { } enableColumnsRearrangement() { - document.getElementById(this.grid.containerId + '_table').setAttribute('style', 'margin-top: 10px'); this.getColumns().forEach((elm) => { elm.setAttribute('draggable', true); this._wrap(elm); @@ -968,7 +967,6 @@ class varienGridAdvanced { } disableColumnsRearrangement() { - document.getElementById(this.grid.containerId + '_table').setAttribute('style', ''); this.getColumns().forEach((elm) => { elm.removeAttribute('draggable'); this._unwrap(elm); diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index 97484bd0931..0004c16a58e 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -222,9 +222,9 @@ tr.dynamic-grid input.input-text { width:154px; } /* Grid heading drag&drop */ .overDrag { background-color: rgba(255, 255, 255, 0.60) !important; } -.overDrag:after { content: '▼'; position: absolute; color: #a92000; z-index: 999999999999999; font-weight: bold; font-size: 18px; top: -15px; overflow: visible } -.overDrag__left::after { left: -10px; } -.overDrag__right::after { right: -10px; } +.overDrag:after { content: ''; position: absolute; background: #a92000; top: 0; width: 4px; height: 100% } +.overDrag__left::after { left:0; } +.overDrag__right::after { right: 0; } .grid__dragPreview { border: 1px solid #a92000; } .grid tr.headings th[draggable], .grid tr.headings th[draggable] a { cursor: move; position: relative; } From 06d34eff541941e085c208bd2a2f34dd98b31211 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Mon, 18 Sep 2023 22:08:50 +0100 Subject: [PATCH 86/92] resetted is a typo, but anyway this small message is now already translated in every language --- .../core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php index b6a3aee7762..b53f1e479b5 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php @@ -30,7 +30,7 @@ abstract class Mage_Adminhtml_Block_Widget_Grid_Advanced_Abstract extends Mage_A public function __construct() { parent::__construct(); - $this->setResetConfirmText(Mage::helper('core')->jsQuoteEscape(Mage::helper('core')->__('Are you sure? The columns order will be resetted to default'))); + $this->setResetConfirmText(Mage::helper('core')->jsQuoteEscape(Mage::helper('core')->__('Are you sure?'))); //$this->setTemplate('widget/grid/advanced.phtml'); } From 3a7a4941882e5911d11ced9d976b7f39a6c5f97b Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Mon, 18 Sep 2023 22:21:23 +0100 Subject: [PATCH 87/92] mega basic ACL check --- .../Mage/Adminhtml/controllers/GridController.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/controllers/GridController.php b/app/code/core/Mage/Adminhtml/controllers/GridController.php index d6bb928eb9d..9233c336df2 100644 --- a/app/code/core/Mage/Adminhtml/controllers/GridController.php +++ b/app/code/core/Mage/Adminhtml/controllers/GridController.php @@ -8,8 +8,7 @@ * * @category Mage * @package Mage_Adminhtml - * @copyright Copyright (c) 2006-2020 Magento, Inc. (https://www.magento.com) - * @copyright Copyright (c) 2022-2023 The OpenMage Contributors (https://www.openmage.org) + * @copyright Copyright (c) 2023 The OpenMage Contributors (https://www.openmage.org) * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) */ @@ -21,6 +20,12 @@ */ class Mage_Adminhtml_GridController extends Mage_Adminhtml_Controller_Action { + /** + * ACL resource + * @see Mage_Adminhtml_Controller_Action::_isAllowed() + */ + public const ADMIN_RESOURCE = 'catalog/products'; + /** * Save grid columns order action */ @@ -43,10 +48,10 @@ public function saveColumnOrderAction() /** * Check is allowed access to action * - * @return true + * @return bool */ protected function _isAllowed() { - return true; + return Mage::getSingleton('admin/session')->isAllowed(static::ADMIN_RESOURCE); } } From 006da272de76e073281baf56ba690ac40c3b2202 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Mon, 18 Sep 2023 22:27:38 +0100 Subject: [PATCH 88/92] not necessary anymore --- skin/adminhtml/default/default/boxes.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skin/adminhtml/default/default/boxes.css b/skin/adminhtml/default/default/boxes.css index 0004c16a58e..7dad6317242 100644 --- a/skin/adminhtml/default/default/boxes.css +++ b/skin/adminhtml/default/default/boxes.css @@ -158,7 +158,7 @@ table.actions td { vertical-align:top; } /* Grid - Headings */ -.grid tr.headings { background:url(images/sort_row_bg.gif) 0 50% repeat-x; position: relative;} +.grid tr.headings { background:url(images/sort_row_bg.gif) 0 50% repeat-x; } .grid tr.headings th { border-width:1px; border-color:#f9f9f9 #d1cfcf #f9f9f9 #f9f9f9; border-style:solid; padding-top:1px; padding-bottom:0; font-size:.9em; } .grid tr.headings th.last { border-right:0; } .grid tr.headings th.no-link { /* Grid th with no sorting functionality */ padding-top:2px; padding-bottom:1px; color:#67767e; } From 4294ed3c52a1eb7544966688aad4759103665351 Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Wed, 20 Sep 2023 19:17:11 +0100 Subject: [PATCH 89/92] Added configuration to enable rearrangement --- .../core/Mage/Adminhtml/Block/Widget/Grid.php | 17 ++++++++-------- .../Block/Widget/Grid/Advanced/Abstract.php | 8 ++++++-- .../Helper/Widget/Grid/Config/Abstract.php | 11 ++++++++++ app/code/core/Mage/Core/etc/system.xml | 20 +++++++++++++++++++ .../adminhtml/default/default/layout/main.xml | 2 +- .../default/template/widget/grid.phtml | 4 +++- 6 files changed, 50 insertions(+), 12 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 90ad401f8d0..2b1f81cbc20 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -332,7 +332,7 @@ public function getSearchButtonHtml() public function getMainButtonsHtml() { $html = ''; - if ($this->getHelperAdvancedGrid()->isEnabled()) { + if ($this->getAdvancedGridHelper()->isEnabled()) { $html .= $this->getToggleColumnsOrderButtonHtml(); $html .= $this->getResetColumnsButtonHtml(); } @@ -683,7 +683,8 @@ protected function _prepareAdvancedGridBlock() { $this->setChild('advanced_grid', $this->getLayout()->createBlock($this->getAdvancedGridBlockName())); - if ($this->getHelperAdvancedGrid()->isEnabled()) { + $helper = $this->getAdvancedGridHelper(); + if ($helper->isEnabled() && $helper->isRearrangeEnabled()) { $this->setChild( 'toggle_columns_order_button', $this->getLayout()->createBlock('adminhtml/widget_button') @@ -709,7 +710,7 @@ protected function _prepareAdvancedGridBlock() * * @return Mage_Adminhtml_Helper_Widget_Grid_Config_Abstract */ - public function getHelperAdvancedGrid(): Mage_Adminhtml_Helper_Widget_Grid_Config_Abstract + public function getAdvancedGridHelper(): Mage_Adminhtml_Helper_Widget_Grid_Config_Abstract { if (!$this->_advancedGridHelper) { // TODO create factory class map block id to helper - create a new grid.xml configuration file @@ -742,10 +743,10 @@ public function getHelperAdvancedGrid(): Mage_Adminhtml_Helper_Widget_Grid_Confi */ protected function _prepareAdvancedGrid() { - if (!$this->getHelperAdvancedGrid()->isEnabled()) { + if (!$this->getAdvancedGridHelper()->isEnabled()) { return $this; } - $this->getHelperAdvancedGrid()->applyAdvancedGridCollection($this->getCollection()); + $this->getAdvancedGridHelper()->applyAdvancedGridCollection($this->getCollection()); return $this; } @@ -756,13 +757,13 @@ protected function _prepareAdvancedGrid() */ protected function _prepareAdvancedGridColumn() { - if (!$this->getHelperAdvancedGrid()->isEnabled()) { + if (!$this->getAdvancedGridHelper()->isEnabled()) { return $this; } //if ($helper instanceof CollectionStrategyInterface) { - $this->getHelperAdvancedGrid()->applyAdvancedGridColumn($this); + $this->getAdvancedGridHelper()->applyAdvancedGridColumn($this); // customize order column - $_orderColumns = $this->getHelperAdvancedGrid()->getOrderColumns(); + $_orderColumns = $this->getAdvancedGridHelper()->getOrderColumns(); if ($_orderColumns) { // Reset Column Order $this->_columnsOrder = []; diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php index b53f1e479b5..5ee1aa687e8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid/Advanced/Abstract.php @@ -31,7 +31,6 @@ public function __construct() { parent::__construct(); $this->setResetConfirmText(Mage::helper('core')->jsQuoteEscape(Mage::helper('core')->__('Are you sure?'))); - //$this->setTemplate('widget/grid/advanced.phtml'); } /** @@ -77,6 +76,11 @@ public function getGridId(): mixed */ public function getJavaScript(): string { + // TODO: would be better to use Mage_Adminhtml_Helper_Widget_Grid_Config_Abstract::isRearrangeEnabled + if (!Mage::getStoreConfig(Mage_Adminhtml_Helper_Widget_Grid_Config_Abstract::CONFIG_PATH_ENABLE_REARRANGE_COLUMNS)) { + return ''; + } + $_content = sprintf( "var %s = new varienGridAdvanced('%s', %s, '%s');", $this->getJsObjectName(), @@ -95,6 +99,6 @@ public function getJavaScript(): string */ public function isAvailable(): bool { - return $this->getParentBlock()->getHelperAdvancedGrid()->isEnabled(); + return $this->getParentBlock()->getAdvancedGridHelper()->isEnabled(); } } diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php index 1f85ce07024..f2471952e91 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php @@ -22,6 +22,7 @@ abstract class Mage_Adminhtml_Helper_Widget_Grid_Config_Abstract extends Mage_Co { public const CONFIG_PATH_GRID_ENABLED = 'advanced_grid/%s/enabled'; public const CONFIG_PATH_GRID_ORDER = 'advanced_grid/%s/order'; + public const CONFIG_PATH_ENABLE_REARRANGE_COLUMNS = 'advanced_grid/general/enabled_rearrange_columns'; /** * Scope grid id for configurations @@ -94,6 +95,16 @@ public function isEnabled(): bool return $this->getStoreConfigGridId(self::CONFIG_PATH_GRID_ENABLED) ?: false; } + /** + * Get grid enabled for custom columns + * + * @return bool + */ + public function isRearrangeEnabled(): bool + { + return Mage::getStoreConfigFlag(self::CONFIG_PATH_ENABLE_REARRANGE_COLUMNS); + } + /** * Collection object * @param Varien_Data_Collection_Db $collection diff --git a/app/code/core/Mage/Core/etc/system.xml b/app/code/core/Mage/Core/etc/system.xml index 2e16c15997a..7fb5a6911bd 100644 --- a/app/code/core/Mage/Core/etc/system.xml +++ b/app/code/core/Mage/Core/etc/system.xml @@ -1679,6 +1679,26 @@ 0 0 + + + 1 + 1 + 0 + 0 + 1 + + + + Enable drag and drop functionality to rearrange columns order for all the grids + select + adminhtml/system_config_source_yesno + 1 + 1 + 0 + 0 + + + 1 diff --git a/app/design/adminhtml/default/default/layout/main.xml b/app/design/adminhtml/default/default/layout/main.xml index 4091aa81f52..00abac93f7e 100644 --- a/app/design/adminhtml/default/default/layout/main.xml +++ b/app/design/adminhtml/default/default/layout/main.xml @@ -60,7 +60,7 @@ Default layout, loads most of the pages - + diff --git a/app/design/adminhtml/default/default/template/widget/grid.phtml b/app/design/adminhtml/default/default/template/widget/grid.phtml index 90886dd2d10..fe22d5b231f 100644 --- a/app/design/adminhtml/default/default/template/widget/grid.phtml +++ b/app/design/adminhtml/default/default/template/widget/grid.phtml @@ -218,7 +218,9 @@ $numColumns = count($this->getColumns()); getAdditionalJavaScript(); ?> - new gridDoubleScroll('getId() ?>', getJsObjectName() ?>); + if (typeof gridDoubleScroll !== 'undefined') { + new gridDoubleScroll('getId() ?>', getJsObjectName() ?>); + } //]]> From 9f3dbd61741e7dbee3f9acecf26df766c9d40e3b Mon Sep 17 00:00:00 2001 From: Fabrizio Balliano Date: Wed, 20 Sep 2023 22:45:20 +0100 Subject: [PATCH 90/92] Implemented ACL --- app/code/core/Mage/Adminhtml/Block/Widget/Grid.php | 2 +- .../Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php | 5 ++++- app/code/core/Mage/Adminhtml/etc/adminhtml.xml | 3 +++ app/locale/en_US/Mage_Adminhtml.csv | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php index 2b1f81cbc20..1d1926ec0b8 100644 --- a/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php +++ b/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php @@ -684,7 +684,7 @@ protected function _prepareAdvancedGridBlock() $this->setChild('advanced_grid', $this->getLayout()->createBlock($this->getAdvancedGridBlockName())); $helper = $this->getAdvancedGridHelper(); - if ($helper->isEnabled() && $helper->isRearrangeEnabled()) { + if ($helper->isEnabled() && $helper->isRearrangeEnabled()) { $this->setChild( 'toggle_columns_order_button', $this->getLayout()->createBlock('adminhtml/widget_button') diff --git a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php index f2471952e91..366c8c82d6c 100644 --- a/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php +++ b/app/code/core/Mage/Adminhtml/Helper/Widget/Grid/Config/Abstract.php @@ -23,6 +23,7 @@ abstract class Mage_Adminhtml_Helper_Widget_Grid_Config_Abstract extends Mage_Co public const CONFIG_PATH_GRID_ENABLED = 'advanced_grid/%s/enabled'; public const CONFIG_PATH_GRID_ORDER = 'advanced_grid/%s/order'; public const CONFIG_PATH_ENABLE_REARRANGE_COLUMNS = 'advanced_grid/general/enabled_rearrange_columns'; + public const ACL_RESOURCE_REARRANGE_COLUMNS = 'admin/system/rearrange_grids_columns'; /** * Scope grid id for configurations @@ -102,7 +103,9 @@ public function isEnabled(): bool */ public function isRearrangeEnabled(): bool { - return Mage::getStoreConfigFlag(self::CONFIG_PATH_ENABLE_REARRANGE_COLUMNS); + return + Mage::getStoreConfigFlag(self::CONFIG_PATH_ENABLE_REARRANGE_COLUMNS) && + Mage::getSingleton('admin/session')->isAllowed(self::ACL_RESOURCE_REARRANGE_COLUMNS); } /** diff --git a/app/code/core/Mage/Adminhtml/etc/adminhtml.xml b/app/code/core/Mage/Adminhtml/etc/adminhtml.xml index 69c861c3e62..9535e6ea5e5 100644 --- a/app/code/core/Mage/Adminhtml/etc/adminhtml.xml +++ b/app/code/core/Mage/Adminhtml/etc/adminhtml.xml @@ -235,6 +235,9 @@ + + Rearrange Grids Columns + Cache Management diff --git a/app/locale/en_US/Mage_Adminhtml.csv b/app/locale/en_US/Mage_Adminhtml.csv index d1221c7c4cd..df04a037514 100644 --- a/app/locale/en_US/Mage_Adminhtml.csv +++ b/app/locale/en_US/Mage_Adminhtml.csv @@ -853,6 +853,7 @@ "Rates","Rates" "Read details","Read details" "Rearrange Columns","Rearrange Columns" +"Rearrange Grids Columns","Rearrange Grids Columns" "Rebuild","Rebuild" "Rebuild Catalog Index","Rebuild Catalog Index" "Rebuild Flat Catalog Category","Rebuild Flat Catalog Category" From 6d096575c775d188c1f1ab8597f297c7691b9c5c Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 21 Sep 2023 08:37:53 +0200 Subject: [PATCH 91/92] rename acl title to admin grids --- app/code/core/Mage/Adminhtml/etc/adminhtml.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/core/Mage/Adminhtml/etc/adminhtml.xml b/app/code/core/Mage/Adminhtml/etc/adminhtml.xml index 9535e6ea5e5..04f1390af45 100644 --- a/app/code/core/Mage/Adminhtml/etc/adminhtml.xml +++ b/app/code/core/Mage/Adminhtml/etc/adminhtml.xml @@ -199,7 +199,7 @@ 100 - Advanced Grid Configuration + Admin Grids 101 From 4aefaedc0449c40c28a528f31a34a5fc23a29cd7 Mon Sep 17 00:00:00 2001 From: Tony Date: Thu, 21 Sep 2023 19:04:38 +0200 Subject: [PATCH 92/92] remove conditionally load doublescroll --- app/design/adminhtml/default/default/layout/main.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/design/adminhtml/default/default/layout/main.xml b/app/design/adminhtml/default/default/layout/main.xml index 00abac93f7e..4091aa81f52 100644 --- a/app/design/adminhtml/default/default/layout/main.xml +++ b/app/design/adminhtml/default/default/layout/main.xml @@ -60,7 +60,7 @@ Default layout, loads most of the pages - +