diff --git a/vendor/magento/module-bundle/Ui/DataProvider/Product/BundleDataProvider.php b/vendor/magento/module-bundle/Ui/DataProvider/Product/BundleDataProvider.php index 5f1ffc3c268..827082dc774 100644 --- a/vendor/magento/module-bundle/Ui/DataProvider/Product/BundleDataProvider.php +++ b/vendor/magento/module-bundle/Ui/DataProvider/Product/BundleDataProvider.php @@ -8,6 +8,9 @@ namespace Magento\Bundle\Ui\DataProvider\Product; use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory; use Magento\Catalog\Ui\DataProvider\Product\ProductDataProvider; use Magento\Bundle\Helper\Data; +use Magento\Framework\App\ObjectManager; +use Magento\Ui\DataProvider\Modifier\ModifierInterface; +use Magento\Ui\DataProvider\Modifier\PoolInterface; class BundleDataProvider extends ProductDataProvider { @@ -16,6 +19,11 @@ class BundleDataProvider extends ProductDataProvider */ protected $dataHelper; + /** + * @var PoolInterface + */ + private $modifiersPool; + /** * Construct * @@ -24,10 +32,12 @@ class BundleDataProvider extends ProductDataProvider * @param string $requestFieldName * @param CollectionFactory $collectionFactory * @param Data $dataHelper - * @param \Magento\Ui\DataProvider\AddFieldToCollectionInterface[] $addFieldStrategies - * @param \Magento\Ui\DataProvider\AddFilterToCollectionInterface[] $addFilterStrategies * @param array $meta * @param array $data + * @param \Magento\Ui\DataProvider\AddFieldToCollectionInterface[] $addFieldStrategies + * @param \Magento\Ui\DataProvider\AddFilterToCollectionInterface[] $addFilterStrategies + * @param PoolInterface|null $modifiersPool + * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( $name, @@ -38,7 +48,8 @@ class BundleDataProvider extends ProductDataProvider array $meta = [], array $data = [], array $addFieldStrategies = [], - array $addFilterStrategies = [] + array $addFilterStrategies = [], + PoolInterface $modifiersPool = null ) { parent::__construct( $name, @@ -52,6 +63,7 @@ class BundleDataProvider extends ProductDataProvider ); $this->dataHelper = $dataHelper; + $this->modifiersPool = $modifiersPool ?: ObjectManager::getInstance()->get(PoolInterface::class); } /** @@ -72,11 +84,34 @@ class BundleDataProvider extends ProductDataProvider ); $this->getCollection()->load(); } + $items = $this->getCollection()->toArray(); - return [ + $data = [ 'totalRecords' => $this->getCollection()->getSize(), 'items' => array_values($items), ]; + + /** @var ModifierInterface $modifier */ + foreach ($this->modifiersPool->getModifiersInstances() as $modifier) { + $data = $modifier->modifyData($data); + } + + return $data; + } + + /** + * @inheritdoc + */ + public function getMeta() + { + $meta = parent::getMeta(); + + /** @var ModifierInterface $modifier */ + foreach ($this->modifiersPool->getModifiersInstances() as $modifier) { + $meta = $modifier->modifyMeta($meta); + } + + return $meta; } } diff --git a/vendor/magento/module-bundle/Ui/DataProvider/Product/Form/Modifier/AddSelectionQtyTypeToProductsData.php b/vendor/magento/module-bundle/Ui/DataProvider/Product/Form/Modifier/AddSelectionQtyTypeToProductsData.php new file mode 100644 index 00000000000..387b82a94c1 --- /dev/null +++ b/vendor/magento/module-bundle/Ui/DataProvider/Product/Form/Modifier/AddSelectionQtyTypeToProductsData.php @@ -0,0 +1,76 @@ +stockRegistryPreloader = $stockRegistryPreloader; + } + + /** + * Modify Meta + * + * @param array $meta + * @return array + */ + public function modifyMeta(array $meta) + { + return $meta; + } + + /** + * Modify Data - checks if new selection can have decimal quantity + * + * @param array $data + * @return array + * @throws NoSuchEntityException + */ + public function modifyData(array $data): array + { + $productIds = array_column($data['items'], 'entity_id'); + + $stockItems = []; + if ($productIds) { + $stockItems = $this->stockRegistryPreloader->preloadStockItems($productIds); + } + + $isQtyDecimals = []; + foreach ($stockItems as $stockItem) { + $isQtyDecimals[$stockItem->getProductId()] = $stockItem->getIsQtyDecimal(); + } + + foreach ($data['items'] as &$item) { + if (isset($isQtyDecimals[$item['entity_id']])) { + $item['selection_qty_is_integer'] = !$isQtyDecimals[$item['entity_id']]; + } + } + + return $data; + } +} diff --git a/vendor/magento/module-bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php b/vendor/magento/module-bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php index 4e2f17fa46d..7b1c254eae6 100644 --- a/vendor/magento/module-bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php +++ b/vendor/magento/module-bundle/Ui/DataProvider/Product/Form/Modifier/BundlePanel.php @@ -403,6 +403,7 @@ class BundlePanel extends AbstractModifier 'selection_price_type' => '', 'selection_price_value' => '', 'selection_qty' => '', + 'selection_qty_is_integer'=> 'selection_qty_is_integer', ], 'links' => [ 'insertData' => '${ $.provider }:${ $.dataProvider }', diff --git a/vendor/magento/module-bundle/etc/adminhtml/di.xml b/vendor/magento/module-bundle/etc/adminhtml/di.xml index f173bb26fcc..4f3069dee65 100644 --- a/vendor/magento/module-bundle/etc/adminhtml/di.xml +++ b/vendor/magento/module-bundle/etc/adminhtml/di.xml @@ -76,4 +76,21 @@ + + + + + Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\AddSelectionQtyTypeToProductsData + 200 + + + + + + + + Magento\Bundle\Ui\DataProvider\Product\Form\Modifier\ModifiersPool + + +