From 93e05430cc906a36f1edd87d70d113afd40fb478 Mon Sep 17 00:00:00 2001 From: Jose Ortega Date: Wed, 13 Sep 2023 10:15:45 +0200 Subject: [PATCH 01/38] #101741 Added exception when level of depth field is not a valid number --- Controller/Adminhtml/Menu/ImportCategories.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Controller/Adminhtml/Menu/ImportCategories.php b/Controller/Adminhtml/Menu/ImportCategories.php index e244eb30..aa9042c1 100644 --- a/Controller/Adminhtml/Menu/ImportCategories.php +++ b/Controller/Adminhtml/Menu/ImportCategories.php @@ -4,12 +4,12 @@ namespace Snowdog\Menu\Controller\Adminhtml\Menu; +use Exception; use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Backend\App\Action; use Magento\Backend\App\Action\Context; use Magento\Framework\Controller\Result\JsonFactory; use Snowdog\Menu\Api\MenuManagementInterface; -use Magento\Framework\Exception\NoSuchEntityException; class ImportCategories extends Action implements HttpPostActionInterface { @@ -47,24 +47,27 @@ public function execute() { $categoryId = (int) $this->_request->getParam('category_id'); $depth = $this->_request->getParam('depth'); - if (!is_numeric($depth)) { - $depth = null; - } - $result = $this->resultJsonFactory->create(); try { + if (!is_numeric($depth)) { + throw new Exception('Please add a valid number for Level of depth field'); + } + $categoryTree = $this->menuManagement->getCategoryNodeList($categoryId, $depth); + $output = [ 'success' => 1, 'list' => $categoryTree ]; - } catch (NoSuchEntityException $exception) { + } catch (Exception $exception) { $output = [ 'success' => 0, 'message' => $exception->getMessage(), 'list' => [] ]; } + + $result = $this->resultJsonFactory->create(); $result->setData($output); return $result; From 5191895e817aab40d50e409f1d30043e01e4084b Mon Sep 17 00:00:00 2001 From: Jose Ortega Date: Wed, 13 Sep 2023 14:53:38 +0200 Subject: [PATCH 02/38] #102271 Adding image size (width and height) to nodes --- Api/Data/NodeInterface.php | 28 +++++++++++++-- Block/Adminhtml/Edit/Tab/Nodes.php | 2 ++ Model/GraphQl/Resolver/DataProvider/Node.php | 2 ++ Model/Menu/Node.php | 32 +++++++++++++++++ Model/Menu/Node/Image/File.php | 8 +++++ Model/MenuManagement.php | 2 ++ Service/Menu/SaveRequestProcessor.php | 38 ++++++++++++++++++-- Setup/UpgradeSchema.php | 37 +++++++++++++++++++ etc/module.xml | 2 +- view/adminhtml/templates/menu/nodes.phtml | 2 ++ view/adminhtml/web/vue/app.vue | 2 ++ view/adminhtml/web/vue/menu-type.vue | 16 +++++++++ 12 files changed, 165 insertions(+), 6 deletions(-) diff --git a/Api/Data/NodeInterface.php b/Api/Data/NodeInterface.php index bf831ddd..113bfef9 100644 --- a/Api/Data/NodeInterface.php +++ b/Api/Data/NodeInterface.php @@ -18,6 +18,8 @@ interface NodeInterface const TARGET = 'target'; const IMAGE = 'image'; const IMAGE_ALT_TEXT = 'image_alt_text'; + const IMAGE_WIDTH = 'image_width'; + const IMAGE_HEIGHT = 'image_heigth'; const CREATION_TIME = 'creation_time'; const UPDATE_TIME = 'update_time'; const IS_ACTIVE = 'is_active'; @@ -192,18 +194,40 @@ public function setImage($image); /** * Get image alt text * - * @return string + * @return string|null */ public function getImageAltText(); /** * Set image alt text * - * @param string $altText + * @param string|null $altText * @return $this */ public function setImageAltText($altText); + /** + * @return int|null + */ + public function getImageWidth(); + + /** + * @param int|null $width + * @return $this + */ + public function setImageWidth($width); + + /** + * @return int|null + */ + public function getImageHeight(); + + /** + * @param int|null $height + * @return $this + */ + public function setImageHeight($height); + /** * Get creation time * diff --git a/Block/Adminhtml/Edit/Tab/Nodes.php b/Block/Adminhtml/Edit/Tab/Nodes.php index 1b55ebf9..17997069 100644 --- a/Block/Adminhtml/Edit/Tab/Nodes.php +++ b/Block/Adminhtml/Edit/Tab/Nodes.php @@ -179,6 +179,8 @@ private function renderNodeList($level, $parent, $data) 'image' => $node->getImage(), 'image_url' => $node->getImage() ? $this->imageFile->getUrl($node->getImage()) : null, 'image_alt_text' => $node->getImageAltText(), + 'image_width' => $node->getImageWidth(), + 'image_height' => $node->getImageHeight(), 'columns' => $this->renderNodeList($level + 1, $node->getId(), $data) ?: [], 'selected_item_id' => $node->getSelectedItemId() ]; diff --git a/Model/GraphQl/Resolver/DataProvider/Node.php b/Model/GraphQl/Resolver/DataProvider/Node.php index 9eba6cd1..4fc84e3b 100644 --- a/Model/GraphQl/Resolver/DataProvider/Node.php +++ b/Model/GraphQl/Resolver/DataProvider/Node.php @@ -103,6 +103,8 @@ private function convertData(NodeInterface $node): array NodeInterface::TARGET => (bool) $node->getTarget(), NodeInterface::IMAGE => $node->getImage(), NodeInterface::IMAGE_ALT_TEXT => $node->getImageAltText(), + NodeInterface::IMAGE_WIDTH => $node->getImageWidth(), + NodeInterface::IMAGE_HEIGHT => $node->getImageHeight(), self::TEMPLATE_FIELD => $node->getNodeTemplate(), self::SUBMENU_TEMPLATE_FIELD => $node->getSubmenuTemplate(), NodeInterface::CREATION_TIME => $node->getCreationTime(), diff --git a/Model/Menu/Node.php b/Model/Menu/Node.php index be2e040f..4e39d4a4 100644 --- a/Model/Menu/Node.php +++ b/Model/Menu/Node.php @@ -214,6 +214,38 @@ public function setImageAltText($altText) return $this->setData(NodeInterface::IMAGE_ALT_TEXT, $altText); } + /** + * @inheritdoc + */ + public function getImageWidth() + { + return $this->_getData(NodeInterface::IMAGE_WIDTH); + } + + /** + * @inheritdoc + */ + public function setImageWidth($width) + { + return $this->setData(NodeInterface::IMAGE_WIDTH, $width); + } + + /** + * @inheritdoc + */ + public function getImageHeight() + { + return $this->_getData(NodeInterface::IMAGE_HEIGHT); + } + + /** + * @inheritdoc + */ + public function setImageHeight($height) + { + return $this->setData(NodeInterface::IMAGE_HEIGHT, $height); + } + /** * @inheritdoc */ diff --git a/Model/Menu/Node/Image/File.php b/Model/Menu/Node/Image/File.php index e71ab8bb..2d5b0398 100644 --- a/Model/Menu/Node/Image/File.php +++ b/Model/Menu/Node/Image/File.php @@ -113,6 +113,14 @@ public function clone(string $file): string return $fileClonePath; } + public function getImageSize(string $file): array + { + $mediaDirectory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA); + $fileFullPath = $mediaDirectory->getAbsolutePath(self::PATH . $file); + + return getimagesize($fileFullPath); + } + private function getAbsolutePath(): string { $mediaDirectory = $this->filesystem->getDirectoryRead(DirectoryList::MEDIA); diff --git a/Model/MenuManagement.php b/Model/MenuManagement.php index fc5a70b6..2c5ae695 100644 --- a/Model/MenuManagement.php +++ b/Model/MenuManagement.php @@ -101,6 +101,8 @@ private function getCategoriesNodeList($level, $parent, array $data): array 'node_template' => null, 'image' => null, 'image_alt_text' => null, + 'image_width' => null, + 'image_height' => null, 'submenu_template' => null, 'columns' => $this->getCategoriesNodeList($level + 1, $nodeId, $data) ?: [] ]; diff --git a/Service/Menu/SaveRequestProcessor.php b/Service/Menu/SaveRequestProcessor.php index 546feec8..3011bbab 100644 --- a/Service/Menu/SaveRequestProcessor.php +++ b/Service/Menu/SaveRequestProcessor.php @@ -202,14 +202,46 @@ private function processNodeObject( $nodeObject->setLevel((string) $level); $nodeObject->setPosition((string) $position); + $this->processImageParameters($nodeData, $nodeObject); + + $nodeObject->setSelectedItemId($nodeData['selected_item_id'] ?? null); + } + + private function processImageParameters(array $nodeData, NodeInterface &$nodeObject): void + { + $nodeObject->setImageAltText($nodeData[NodeInterface::IMAGE_ALT_TEXT] ?? null); + if ($nodeObject->getImage() && empty($nodeData['image'])) { $this->nodeImageFile->delete($nodeObject->getImage()); } - $nodeObject->setImage($nodeData['image'] ?? null); - $nodeObject->setImageAltText($nodeData['image_alt_text'] ?? null); + if (empty($nodeData[NodeInterface::IMAGE])) { + $nodeObject->setImageWidth(null); + $nodeObject->setImageHeight(null); + $nodeObject->setImage(null); + return; + } - $nodeObject->setSelectedItemId($nodeData['selected_item_id'] ?? null); + if (empty($nodeData[NodeInterface::IMAGE_WIDTH]) + || empty($nodeData[NodeInterface::IMAGE_HEIGHT]) + ) { + $imageSize = $this->nodeImageFile->getImageSize($nodeData[NodeInterface::IMAGE]); + + if (!empty($imageSize)) { + $nodeObject + ->setImageWidth( + !empty($nodeData[NodeInterface::IMAGE_WIDTH]) + ? $nodeData[NodeInterface::IMAGE_WIDTH] + : $imageSize[0] + ); + $nodeObject + ->setImageHeight( + !empty($nodeData[NodeInterface::IMAGE_HEIGHT]) + ? $nodeData[NodeInterface::IMAGE_HEIGHT] + : $imageSize[1] + ); + } + } } /** diff --git a/Setup/UpgradeSchema.php b/Setup/UpgradeSchema.php index 69f29186..11dcc572 100644 --- a/Setup/UpgradeSchema.php +++ b/Setup/UpgradeSchema.php @@ -59,6 +59,10 @@ public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $con $this->addNodeSelectedItemId($setup); } + if (version_compare($context->getVersion(), '0.2.7', '<')) { + $this->addNodeImageSizeFields($setup); + } + $setup->endSetup(); } @@ -298,4 +302,37 @@ private function addNodeSelectedItemId(SchemaSetupInterface $setup) return $this; } + + /** + * @return $this + */ + private function addNodeImageSizeFields(SchemaSetupInterface $setup) + { + $connection = $setup->getConnection(); + $table = $setup->getTable('snowmenu_node'); + + $connection->addColumn( + $table, + NodeInterface::IMAGE_WIDTH, + [ + 'type' => Table::TYPE_INTEGER, + 'nullable' => true, + 'after' => NodeInterface::IMAGE_ALT_TEXT, + 'comment' => 'Image Width' + ] + ); + + $connection->addColumn( + $table, + NodeInterface::IMAGE_HEIGHT, + [ + 'type' => Table::TYPE_INTEGER, + 'nullable' => true, + 'after' => NodeInterface::IMAGE_WIDTH, + 'comment' => 'Image Height' + ] + ); + + return $this; + } } diff --git a/etc/module.xml b/etc/module.xml index f58fd655..634814e2 100644 --- a/etc/module.xml +++ b/etc/module.xml @@ -1,6 +1,6 @@ - + diff --git a/view/adminhtml/templates/menu/nodes.phtml b/view/adminhtml/templates/menu/nodes.phtml index e4a61867..ecb17e5c 100644 --- a/view/adminhtml/templates/menu/nodes.phtml +++ b/view/adminhtml/templates/menu/nodes.phtml @@ -70,6 +70,8 @@ $vueComponents = $block->getVueComponents(); "product" : "", "productId" : "", "imageAltText" : "", + "imageWidth" : "", + "imageHeight" : "", "selectedItemId" : "" } } diff --git a/view/adminhtml/web/vue/app.vue b/view/adminhtml/web/vue/app.vue index 3e5494de..ea999de5 100644 --- a/view/adminhtml/web/vue/app.vue +++ b/view/adminhtml/web/vue/app.vue @@ -131,6 +131,8 @@ content: null, image: null, image_alt_text: '', + image_width: '', + image_height: '', node_template: null, submenu_template: null, columns: [], diff --git a/view/adminhtml/web/vue/menu-type.vue b/view/adminhtml/web/vue/menu-type.vue index 6479f277..95051e7f 100644 --- a/view/adminhtml/web/vue/menu-type.vue +++ b/view/adminhtml/web/vue/menu-type.vue @@ -65,6 +65,22 @@ type="text" /> + + + +

{{ templatesLabel }}

From 508d7ff4de2b2b063e67c91cb96ed9331a05629d Mon Sep 17 00:00:00 2001 From: Jose Ortega Date: Wed, 13 Sep 2023 14:56:59 +0200 Subject: [PATCH 03/38] Ignored CyclomaticComplexity for upgrade method in schema installer --- Setup/UpgradeSchema.php | 1 + 1 file changed, 1 insertion(+) diff --git a/Setup/UpgradeSchema.php b/Setup/UpgradeSchema.php index 11dcc572..0135c16d 100644 --- a/Setup/UpgradeSchema.php +++ b/Setup/UpgradeSchema.php @@ -22,6 +22,7 @@ class UpgradeSchema implements UpgradeSchemaInterface /** * {@inheritdoc} * @SuppressWarnings(PHPMD.NPathComplexity) + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context) { From b15979c78c83fa9c32ffdd34eded8e6aa39a0675 Mon Sep 17 00:00:00 2001 From: Jose Ortega Date: Fri, 15 Sep 2023 13:53:56 +0200 Subject: [PATCH 04/38] #102271 CR fixes: added new fields to menu block Also fixed some docs --- Block/Menu.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Block/Menu.php b/Block/Menu.php index 07a0853e..9ce9f743 100644 --- a/Block/Menu.php +++ b/Block/Menu.php @@ -9,6 +9,7 @@ use Magento\Framework\View\Element\Template; use Magento\Framework\Event\Manager as EventManager; use Magento\Framework\Escaper; +use Snowdog\Menu\Api\Data\NodeInterface; use Snowdog\Menu\Api\MenuRepositoryInterface; use Snowdog\Menu\Api\NodeRepositoryInterface; use Snowdog\Menu\Model\Menu\Node\Image\File as ImageFile; @@ -268,7 +269,7 @@ public function isViewAllLinkAllowed($nodeType) } /** - * @param NodeRepositoryInterface $node + * @param NodeInterface $node * @return string */ public function renderViewAllLink($node) @@ -279,7 +280,7 @@ public function renderViewAllLink($node) } /** - * @param NodeRepositoryInterface $node + * @param NodeInterface $node * @return string */ public function renderMenuNode($node) @@ -381,7 +382,7 @@ public function getMenuCssClass($defaultClass = '') } /** - * @param NodeRepositoryInterface $node + * @param NodeInterface $node * @return Template */ private function getMenuNodeBlock($node) @@ -404,6 +405,9 @@ private function getMenuNodeBlock($node) ->setImage($node->getImage()) ->setImageUrl($node->getImage() ? $this->imageFile->getUrl($node->getImage()) : null) ->setImageAltText($node->getImageAltText()) + ->setImageWidth($node->getImageWidth()) + ->setImageHeight($node->getImageHeight()) + ->setImageAltText($node->getImageAltText()) ->setCustomTemplate($node->getNodeTemplate()) ->setAdditionalData($node->getAdditionalData()) ->setSelectedItemId($node->getSelectedItemId()); From 34fa2db452923f4dd99bc7b3d28c020f0197d3e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Oct 2023 07:43:54 +0000 Subject: [PATCH 05/38] Bump debug from 4.1.1 to 4.3.4 Bumps [debug](https://github.com/debug-js/debug) from 4.1.1 to 4.3.4. - [Release notes](https://github.com/debug-js/debug/releases) - [Commits](https://github.com/debug-js/debug/compare/4.1.1...4.3.4) --- updated-dependencies: - dependency-name: debug dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/yarn.lock b/yarn.lock index e96fb622..c91ec4f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -184,21 +184,7 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -debug@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^4.3.4: +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -543,7 +529,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -ms@2.1.2, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== From e217e9291d8b72dc0cbeab937faf8997f54aeab9 Mon Sep 17 00:00:00 2001 From: Ola Date: Mon, 8 Jan 2024 11:18:56 +0100 Subject: [PATCH 06/38] #102271 - change size input type --- view/adminhtml/web/vue/app.vue | 4 ++-- view/adminhtml/web/vue/menu-type.vue | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/view/adminhtml/web/vue/app.vue b/view/adminhtml/web/vue/app.vue index ea999de5..119f365b 100644 --- a/view/adminhtml/web/vue/app.vue +++ b/view/adminhtml/web/vue/app.vue @@ -131,8 +131,8 @@ content: null, image: null, image_alt_text: '', - image_width: '', - image_height: '', + image_width: null, + image_height: null, node_template: null, submenu_template: null, columns: [], diff --git a/view/adminhtml/web/vue/menu-type.vue b/view/adminhtml/web/vue/menu-type.vue index 95051e7f..4cfc7a50 100644 --- a/view/adminhtml/web/vue/menu-type.vue +++ b/view/adminhtml/web/vue/menu-type.vue @@ -67,19 +67,20 @@ + id="image_width" + v-model="item.image_width" + :label="config.translation.imageWidth" + type="number" + /> - + id="image_height" + v-model="item.image_height" + :label="config.translation.imageHeight" + type="number" + /> +

{{ templatesLabel }} From 84446bed91f94f431ffdb3f253c6a768d854d38e Mon Sep 17 00:00:00 2001 From: Ola Date: Mon, 8 Jan 2024 11:19:43 +0100 Subject: [PATCH 07/38] #102271 - remove size input after image is deleted --- .../web/vue/field-type/image-upload.vue | 132 +++++++++--------- 1 file changed, 67 insertions(+), 65 deletions(-) diff --git a/view/adminhtml/web/vue/field-type/image-upload.vue b/view/adminhtml/web/vue/field-type/image-upload.vue index 54318920..27adbe2f 100644 --- a/view/adminhtml/web/vue/field-type/image-upload.vue +++ b/view/adminhtml/web/vue/field-type/image-upload.vue @@ -1,8 +1,8 @@