Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / modules / layout_builder / src / Controller / MoveBlockController.php
diff --git a/web/core/modules/layout_builder/src/Controller/MoveBlockController.php b/web/core/modules/layout_builder/src/Controller/MoveBlockController.php
new file mode 100644 (file)
index 0000000..cb8e71f
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+
+namespace Drupal\layout_builder\Controller;
+
+use Drupal\Core\DependencyInjection\ClassResolverInterface;
+use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
+use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
+use Drupal\layout_builder\SectionStorageInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Defines a controller to move a block.
+ *
+ * @internal
+ */
+class MoveBlockController implements ContainerInjectionInterface {
+
+  use LayoutRebuildTrait;
+
+  /**
+   * The layout tempstore repository.
+   *
+   * @var \Drupal\layout_builder\LayoutTempstoreRepositoryInterface
+   */
+  protected $layoutTempstoreRepository;
+
+  /**
+   * LayoutController constructor.
+   *
+   * @param \Drupal\layout_builder\LayoutTempstoreRepositoryInterface $layout_tempstore_repository
+   *   The layout tempstore repository.
+   * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver
+   *   The class resolver.
+   */
+  public function __construct(LayoutTempstoreRepositoryInterface $layout_tempstore_repository, ClassResolverInterface $class_resolver) {
+    $this->layoutTempstoreRepository = $layout_tempstore_repository;
+    $this->classResolver = $class_resolver;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('layout_builder.tempstore_repository'),
+      $container->get('class_resolver')
+    );
+  }
+
+  /**
+   * Moves a block to another region.
+   *
+   * @param \Drupal\layout_builder\SectionStorageInterface $section_storage
+   *   The section storage.
+   * @param int $delta_from
+   *   The delta of the original section.
+   * @param int $delta_to
+   *   The delta of the destination section.
+   * @param string $region_to
+   *   The new region for this block.
+   * @param string $block_uuid
+   *   The UUID for this block.
+   * @param string|null $preceding_block_uuid
+   *   (optional) If provided, the UUID of the block to insert this block after.
+   *
+   * @return \Drupal\Core\Ajax\AjaxResponse
+   *   An AJAX response.
+   */
+  public function build(SectionStorageInterface $section_storage, $delta_from, $delta_to, $region_to, $block_uuid, $preceding_block_uuid = NULL) {
+    $section = $section_storage->getSection($delta_from);
+
+    $component = $section->getComponent($block_uuid);
+    $section->removeComponent($block_uuid);
+
+    // If the block is moving from one section to another, update the original
+    // section and load the new one.
+    if ($delta_from !== $delta_to) {
+      $section = $section_storage->getSection($delta_to);
+    }
+
+    // If a preceding block was specified, insert after that. Otherwise add the
+    // block to the front.
+    $component->setRegion($region_to);
+    if (isset($preceding_block_uuid)) {
+      $section->insertAfterComponent($preceding_block_uuid, $component);
+    }
+    else {
+      $section->insertComponent(0, $component);
+    }
+
+    $this->layoutTempstoreRepository->set($section_storage);
+    return $this->rebuildLayout($section_storage);
+  }
+
+}